c++ - 如何在类中正确使用智能指针
问题描述
我在 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;
}
解决方案
- 您不能多次将相同的原始指针直接转换为共享指针,因为这样您将有几个彼此一无所知的所有者,每个所有者都认为它可以完全控制该对象。这就是为什么
std::shared_ptr<binaryNode> node {this}
给你一个双重删除。 shared_from_this
除非至少有一个共享指针已经指向您的对象,否则您也不能使用。这就是为什么std::shared_ptr<binaryNode> node = shared_from_this ()
不起作用。
如果您想要共享指针,请将它们全部共享。例如:
// binaryNode* bn = new binaryNode(9); <-- nope!
auto bn = std::make_shared<binaryNode>(9);
// binaryNode* node = this; <-- nope!
std::shared_ptr<binaryNode> node = shared_from_this();
我不建议在这里使用共享指针。唯一指针更合适。
推荐阅读
- c - 在命令行计算器的 main() 参数中使用 *
- scala - spray.json.JsonParser$ParsingException:输入索引处的意外字符“纲”
- python - 如何在 Azure 机器学习管道中使用 U-SQL 脚本生成的结果运行 Python 脚本?
- android - Kotlin:如何将 if-else like 条件与 let 块一起用于“空”检查
- numpy - numpy数组和张量流常数之间的点积的形状
- python - 在二维张量对象中查找行的索引
- android - 在未弹出的 Expo App 中编辑 AndroidManifest?
- jpa - EntityManager 不会删除复合实体
- google-geocoding-api - 地理编码器错误响应出现在 Google 搜索结果中
- jupyter-notebook - 如何在 Jupyter Notebook 中显示输入单元格?