确保向量内的共享指针正确推回
Ensuring shared pointers within vector are pushed back properly
我可能有一个错误的某些方面,这确实是我第一次特别处理共享指针。
我正在努力穿越一棵树。我的树由一个链接列表组成,一个共享指针的向量代表每个节点的所有孩子。要穿越,我(首先)尝试这样做:
//--------------------------------------------------------------
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](root)的孩子。对于每个孩子,对他们进行相同的循环。如果孩子是孩子[0],请继续将其坐标添加到相同的temp_mesh对象中,但是如果它是另一个孩子,请创建一个新的网格来存储它,以及所有的第一个孩子。任何新的网格都应将指针推回网格向量(向量>)。
任何人都有建议我如何更有效地做到这一点,或者在记忆中处理这些指针时会出错。
当前正在返回不良访问错误。
那么,这就是您应该担心的首要任务。那是一个严重的错误。
我能告诉我,看起来我正在插入一个指向临时对象,temp_node和temp_mesh的指针。
这不是"临时"对象,这意味着不同的东西(为什么在变量名称中继续使用" temp"?),但是您对问题是正确的:
shared_ptr<ofMesh> shared_mesh(&temp_mesh);
这将创建一个拥有指针&temp_mesh
的shared_ptr
,因此当没有更多的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
无法拥有的物品的所有权。
*,或者您可以使用" null deleter",但对于此答案来说太过高了,并且不可能使用这样的自动变量。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址