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

Ensuring shared pointers within vector are pushed back properly

本文关键字:指针 共享 向量 确保      更新时间:2023-10-16

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

我正在努力穿越一棵树。我的树由一个链接列表组成,一个共享指针的向量代表每个节点的所有孩子。要穿越,我(首先)尝试这样做:

//--------------------------------------------------------------
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_meshshared_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",但对于此答案来说太过高了,并且不可能使用这样的自动变量。