【发布时间】:2021-04-18 09:34:31
【问题描述】:
我正在用 C++ 创建一棵二叉树,但在节点类中使用智能指针时遇到了一些问题。 使用普通指针时,一切正常,但使用智能指针时,它就无法正常工作。我认为问题出在插入方法中的这一行:
'''
binaryNode* node = this; // This is working
std::shared_ptr<binaryNode> node {this}; // This throws "double free or corruption" error
std::shared_ptr<binaryNode> node = shared_from_this (); // This throws "bad weak ptr error", I am correctly inheriting from enable_shared_from_this
'''
如何使用智能指针复制binaryNode* node = this;?
我什至尝试成功地使用public std::enable_shared_from_this<binaryNode>。
感谢您的帮助!
编辑:
我会尝试更好地解释自己。这是二叉搜索树的insert() 函数,看起来像这样(这是.cpp 文件):
'''
#include "binarynode.h"
binaryNode::binaryNode(int value){
this->value = value;
this->right = nullptr;
this->left = nullptr;
}
void binaryNode::insert(int value){
binaryNode* node = this;
while(true){
if(value > node->value){
if(node->right != nullptr){
node = node->right;
}else{
node->right = new binaryNode(value);
break;
}
}else if(value < node->value){
if(node->left != nullptr){
node = node->left;
}else{
node->left = new binaryNode(value);
break;
}
}else{
return;
}
}
如何使用智能指针复制它?
编辑 2: 这是我的 .h 文件:
'''
#ifndef BINARYNODE_H
#define BINARYNODE_H
class binaryNode
{
public:
int value;
binaryNode(int value);
binaryNode* right;
binaryNode* left;
void insert(int value);
};
#endif // BINARYNODE_H
这是主文件:
#include <iostream>
#include "binarynode.h"
using namespace std;
void printTree(binaryNode* node){
if(node == nullptr) return;
cout << node->value << endl;
printTree(node->left);
printTree(node->right);
}
int main(){
binaryNode* bn = new binaryNode(9);
bn->insert(4);
bn->insert(20);
bn->insert(1);
bn->insert(6);
bn->insert(15);
bn->insert(170);
printTree(bn);
return 0;
}
【问题讨论】:
-
再一次,我们需要一个minimal reproducible example。也就是我们可以实际运行的一段代码,并看到与您相同的错误,但尽可能减少。
-
如果你想使用 shared_from_this(),实际上 `public std::enable_shared_from_this
` 是必须的。也就是说,我真的不明白为什么您需要共享 ptr,因为节点拥有子节点,从您的代码中看到的内容不应存在共享所有权。 -
要遍历树,你不需要智能指针,原始指针应该没问题,因为你没有任何所有权。
-
我添加了我正在使用的所有代码。使用原始指针很好,但是当我尝试使用智能指针时,我得到了上面提到的错误。
标签: c++ class smart-pointers