如何解决删除其他人共享的对象的问题

时间:2017-04-02 14:42:35

标签: c++ memory-management

我有这种情况:

struct B 
{ 
   A * ptr; 
}

A * a1 = new A1;

b1.ptr = a1
b2.ptr = a1
b3.ptr = a2

现在我delete a1位于不同的地方,但没有关于b个对象的信息。如何自动设置:

b1.ptr = null 
b2.ptr = null

或者如何调用此机制,以便我可以“谷歌”更多信息。

2 个答案:

答案 0 :(得分:1)

(编辑:删除了意外错误的想法)

您的根本问题似乎是所有权:

你的B结构不拥有A对象(你在其他地方创建它),因此它不知道A对象的删除。

在C ++中,您可以选择使用共享指针:

struct B{
    std::weak_ptr<A> ptr;
}
std::shared_ptr<A> object = std::make_shared<A>();
B.ptr = object;

在这种情况下,弱ptr将像

一样使用
if(B.ptr.lock()){
    //Your code here
}

这会阻止在共享指针退出引用时释放对象。

没有简单的方法来通知结构B基础数据已被删除,因为指针只是一个存储对象分配位置的数字。这个数字不知道对象会发生什么。

最后,最后一个选项是制作一些notify()方法,该方法通知所有B对象删除了某个A对象,尽管这需要进行大量的重新处理,而且老实说这不是最佳解决方案。

我希望它有所帮助:)。

答案 1 :(得分:1)

这基本上是cppreference - std::weak_ptr示例的副本。如果它们仍然有效,它会为B.ptr及之后的检查分配共享指针。请注意,此代码不会将ptr设置为NULL。另请注意,标准智能指针需要一个提供C ++ 11的编译器。

#include <iostream>
#include <memory>

struct A {};

struct B {
    std::weak_ptr<A> ptr;
};

int main(int argc, char **argv)
{
    B b1, b2, b3;

    {
        std::shared_ptr<A> a1{new A()};
        std::shared_ptr<A> a2{new A()};

        b1.ptr = a1;
        b2.ptr = a1;
        b3.ptr = a2;
    }

    // a1 and a2 don't exist anymore

    auto tmp = b1.ptr.lock();
    if (tmp) {
        std::cout << "Ok to use\n";
    } else {
        std::cout << "Already deleted\n";
    }

    return 0;
}