删除对象而不调用成员指针的析构函数

时间:2018-01-15 22:54:59

标签: c++

我有一个Mesh课程。

我有另一个名为Safemesh的课程。

许多safemeshes存储指向同一个Mesh的指针。

当我调用Safemesh的析构函数时,我不想删除我的网格。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

  

当我打电话给Safemesh的析构函数时,我不想删除我的网格。

     

我该怎么做?

不删除Safemesh的析构函数中的Mesh指针。如果析构函数不需要或者不需要做任何其他事情,那么隐式生成的析构函数就可以了。

示例:

struct Mesh;
struct Safemesh {
    Mesh* mesh;
};

这当然会让你在别处摧毁网格。

一种解决方案是将Meshes存储在容器中,并确保在任何依赖Safemesh被销毁或设置为指向其他地方之前,不会销毁该容器的任何元素。例如:

std::vector<Mesh> meshes(2);
Safemesh safe0 { &meshes[0] };
Safemesh safe1 { &meshes[0] };
Safemesh safe2 { &meshes[1] };
Safemesh safe3 { &meshes[1] };

另一种解决方案是使用共享所有权:当指向特定网格的最后一个Safemesh被销毁时,只有这样才能销毁网格。这可以通过使用引用计数来实现。标准库中有一个引用计数智能指针:std::shared_ptr。例如:

struct Safemesh {
   std::shared_ptr<Mesh> mesh;
};