【发布时间】:2017-07-10 08:06:15
【问题描述】:
我可能在某些方面有这样的错误,这真的是我第一次特别处理共享指针。
我正在遍历一棵树。我的树由一个链表组成,其中一个共享指针向量表示每个节点的所有子节点。为了遍历,我(首先)尝试这样做:
//--------------------------------------------------------------
void setupMesh(){
Mesh mesh;
shared_ptr<Mesh> shared_mesh(&mesh);
meshes.push_back(shared_mesh);
checkChildren(root, &temp_mesh);
}
//--------------------------------------------------------------
void checkChildren(Node * temp_node, Mesh * temp_mesh){
if(!temp_node->children.empty()){
for(int i = 0; i < temp_node->children.size(); i++){
if(i > 0){
shared_ptr<Mesh> new_mesh(new Mesh);
meshes.push_back(new_mesh);
}
temp_node = temp_node->children[0].get();
checkChildren(temp_child, temp_mesh);
}
}
}
我的树结构本身看起来不错,但更多的是我如何遍历它以及我如何跟踪指针的问题。它当前返回错误的访问错误。据我所知,我似乎正在插入一个指向临时对象、temp_node 和 temp_mesh 的指针。
为了简化我的想法:
遍历属于节点[0](根)的所有子节点。 对于每个孩子,对他们执行相同的循环。如果孩子是 child[0],继续将它的坐标添加到同一个 temp_mesh 对象,但如果它是另一个孩子,则创建一个新的网格来存储它,以及它的所有第一个孩子。 任何新的网格都应该有一个指针被推回网格矢量 (vector>)。
有没有人建议我如何更有效地做到这一点,或者我在处理内存中的这些指针时哪里出错了。
【问题讨论】:
-
请把edit 改成minimal reproducible example,而不是(看起来像)你的完整代码——也就是说,删除不相关的代码,直到你得到最短的可读、可编译的代码,证明问题。
-
希望现在就足够了!
-
(这是一个有争议的问题,因为有人回答了,但为了完整起见:)非常接近!添加一个示例
main和Node和Mesh的定义,其中包含 刚刚 足以复制问题。它需要是完整的——也就是说,如果我将您提供的代码复制/粘贴到我的编辑器中,它就会编译、运行并演示问题。我在第一条评论中链接的文章提供了比以往更好的描述。
标签: c++ pointers vector shared-ptr