Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:vector中的shared_ptr未更新原始shared_ptr 我正在用C++做一个学校作业(我还在学习)。我正在尝试实现随机生成的二叉树结构,使用共享的ptr在多个位置存储节点的信息(我在作业中需要它)。考虑下面的示例代码(这是我的小测试程序): #包括 #包括 结构节点:public std::从\u中启用\u共享\u{ char值; int值; std::左侧共享的ptr; std::共享的ptr权限; std::共享的ptr父级; std::shared_ptr getPtr() { 从_this()返回共享的_; } 节点():intValue(0) { charValue=0; } }; int main(int argc,字符**argv){ std::向量树; std::shared_ptr root=std::make_shared(); treeQueue.clear(); treeQueue.push_back(root->left);//std::shared_ptr(root->left);//root->left->getPtr(); treeQueue.push_back(root->right);//std::shared_ptr(root->right);//root->right->getPtr(); treeQueue[1]=std::make_shared();//std::shared_ptr(新节点); 系统(“暂停”); 返回0; }_C++_Vector_Tree_Shared Ptr - Fatal编程技术网

C++;:vector中的shared_ptr未更新原始shared_ptr 我正在用C++做一个学校作业(我还在学习)。我正在尝试实现随机生成的二叉树结构,使用共享的ptr在多个位置存储节点的信息(我在作业中需要它)。考虑下面的示例代码(这是我的小测试程序): #包括 #包括 结构节点:public std::从\u中启用\u共享\u{ char值; int值; std::左侧共享的ptr; std::共享的ptr权限; std::共享的ptr父级; std::shared_ptr getPtr() { 从_this()返回共享的_; } 节点():intValue(0) { charValue=0; } }; int main(int argc,字符**argv){ std::向量树; std::shared_ptr root=std::make_shared(); treeQueue.clear(); treeQueue.push_back(root->left);//std::shared_ptr(root->left);//root->left->getPtr(); treeQueue.push_back(root->right);//std::shared_ptr(root->right);//root->right->getPtr(); treeQueue[1]=std::make_shared();//std::shared_ptr(新节点); 系统(“暂停”); 返回0; }

C++;:vector中的shared_ptr未更新原始shared_ptr 我正在用C++做一个学校作业(我还在学习)。我正在尝试实现随机生成的二叉树结构,使用共享的ptr在多个位置存储节点的信息(我在作业中需要它)。考虑下面的示例代码(这是我的小测试程序): #包括 #包括 结构节点:public std::从\u中启用\u共享\u{ char值; int值; std::左侧共享的ptr; std::共享的ptr权限; std::共享的ptr父级; std::shared_ptr getPtr() { 从_this()返回共享的_; } 节点():intValue(0) { charValue=0; } }; int main(int argc,字符**argv){ std::向量树; std::shared_ptr root=std::make_shared(); treeQueue.clear(); treeQueue.push_back(root->left);//std::shared_ptr(root->left);//root->left->getPtr(); treeQueue.push_back(root->right);//std::shared_ptr(root->right);//root->right->getPtr(); treeQueue[1]=std::make_shared();//std::shared_ptr(新节点); 系统(“暂停”); 返回0; },c++,vector,tree,shared-ptr,C++,Vector,Tree,Shared Ptr,在本例中,我初始化一个根,并希望在树结构中选择它之前保持树的其他每个节点为空。在我的家庭作业中,我决定在向量树中推后选择哪个节点。(我从那里随机挑选) 问题:例如,在上面的代码中,当我初始化treeQueue[1]时,我希望root->right也被初始化。因为它们是相同的指针。但它还是空的!我还将我尝试过的其他方法放在treeQueue中(这也不起作用)。我也尝试过“从这个启用共享”,这就是它存在的原因 有办法做到这一点吗?还是有其他技术可以提供我所需要的相同功能 我了解到使用原始指针是不健康

在本例中,我初始化一个根,并希望在树结构中选择它之前保持树的其他每个节点为空。在我的家庭作业中,我决定在向量树中推后选择哪个节点。(我从那里随机挑选)

问题:例如,在上面的代码中,当我初始化treeQueue[1]时,我希望root->right也被初始化。因为它们是相同的指针。但它还是空的!我还将我尝试过的其他方法放在treeQueue中(这也不起作用)。我也尝试过“从这个启用共享”,这就是它存在的原因

有办法做到这一点吗?还是有其他技术可以提供我所需要的相同功能


我了解到使用原始指针是不健康的,所以我使用了shared_ptr,这很有意义,但现在我遇到了这个问题。请帮帮我,我会失去理智的。我到处找。我尝试了我找到的所有东西。

shared\u ptr
分享了
ptr
指向的内容。
shared\u ptr
本身不以任何方式、形状、物质或形式“共享”。引用同一对象(共享对象)的每个
shared\u ptr
,都是它自己的、独立的、离散的共享指针

在这里,您将一个
shared\u ptr
复制到另一个
shared\u ptr
。然后,您将
共享的\u ptr
的副本替换为另一个新构造的
共享的\u ptr

新构造的
shared_ptr
与第一个(复制自)引用的原始
shared_ptr
无关

您的代码相当于以下代码:

int *a=NULL;

int *b=a;

b=new int{4};

您现在是否希望
*a
返回
4
?。当然不是。它们是两个完全不同的指针。

感谢萨姆·瓦沙维奇让我明白了我的错误。最后,我也采纳了Jarod42的建议,并将treeQueue用作

std::vector<std::shared_ptr<Node>*>
std::vector
它成功了。因此,我将此注释标记为解决方案,作为对这两条注释的引用:)

为什么希望
root->right
被初始化?您没有在任何地方初始化它。
treeQueue[1]=std::make_shared()
不会影响
根目录->右目录
,您只需用新值擦除一个空的
共享目录
根目录->右目录
)。你可能想要
std::vector
…我不明白你的问题。你想完成什么?treQueue[1]和root->right不是同一个指针吗?所以当我初始化一个时,我认为另一个也会指向同一个对象。或者至少这是我打算做的。我想在共享的ptr为空时将其推入向量中,当我从向量中随机选取它进行初始化时,我希望原始的共享ptr(root->right)也被初始化。哦,我理解,谢谢。那么,您能建议实现这一点的方法吗?您应该在
Node()
的构造函数中初始化left/right。但是,您还有另一个问题:如果您创建一个完全由
shared_ptr
s链接的树(无论是在构造函数中正确完成的,还是手动完成的),您将创建一个循环引用(在父级和子级之间),这将导致内存泄漏。既然您已经了解了有关共享的所有内容,那么您还需要了解薄弱点是什么。
std::vector<std::shared_ptr<Node>*>