确保向量内的共享指针被正确推回

时间:2017-02-20 21:48:23

标签: c++ pointers vector shared-ptr

我可能有一些方面的错误,这是我第一次特别处理共享指针。

我正在寻找一棵树。我的树由一个链表组成,带有一个共享指针向量,表示每个节点的所有子节点。为了遍历,我(开始)尝试这样做:

{{1}}

我的树形结构本身似乎很好,但它更多的是我如何遍历它,以及我如何跟踪指针。它目前正在返回错误的访问错误。据我所知,看起来我正在插入指向临时对象,temp_node和temp_mesh的指针。

简化我想到的过程:

遍历属于node [0](root)的所有子节点。 对于每个孩子,在他们身上执行相同的循环。如果孩子是孩子[0],继续将它的坐标添加到同一个temp_mesh对象,但如果是另一个孩子,则创建一个新的网格来存储它,以及它的所有第一个孩子。 任何新的网格都应该有一个指针推回到网格矢量(矢量>)。

有没有人建议我如何更有效地做到这一点,或者我在处理内存中的这些指针时出错了。

1 个答案:

答案 0 :(得分:4)

  

目前正在返回错误的访问错误。

那就是你应该担心的第一要务。那是一个严重的错误。

  

据我所知,看起来我正在插入指向临时对象,temp_node和temp_mesh的指针。

这不是“临时”对象,这意味着不同的东西(为什么你在变量名中继续使用“temp”?),但你对这个问题是正确的:

shared_ptr<ofMesh> shared_mesh(&temp_mesh);

这会创建一个shared_ptr 拥有指针&temp_mesh,因此当没有更多shared_ptr个对象共享该指针的所有权时,将删除它。

但是该指针是自动变量(也就是堆栈变量)的地址,它在块的末尾超出了范围。您没有“拥有”该对象,该功能的块范围会自动管理它。如果您不拥有它,那么您无法将其归属于shared_ptr,因为您不能放弃它。

当范围结束时,自动变量temp_mesh将自动销毁,但仍有shared_ptr个对象持有该指针,认为它们拥有它。当您尝试通过那些shared_ptr对象访问对象时,您将访问被破坏的对象,在其生命周期结束后。然后,当没有更多shared_ptr个拥有指针的对象时,它将被删除,但它不是用new创建的,因此这是一个严重的错误。 (你在另一个函数中得到了这个权利,所以我不确定你为什么在setupMesh中做错了。)

如果您希望shared_ptr拥有对象,则需要使用new创建对象,或者最好使用std::make_shared创建对象:*

shared_ptr<ofMesh> mesh = std::make_shared<ofMesh>();
mesh0->setMode(OF_PRIMITIVE_LINE_STRIP);
mesh->setupIndicesAuto();
mesh->addVertex(root->location);
mesh->addColor(ofColor(0));

meshes.push_back(shared_mesh);

checkChildren(root, mesh.get());

这会立即创建一个由shared_ptr拥有的对象,因此不存在转移shared_ptr无法拥有的内容的所有权的问题。

*或者您可以使用“空删除器”,但这对于此答案来说太高级了,并且不能使用这样的自动变量。