繁体   English   中英

我该如何解决删除彼此共享的对象的问题

[英]How can I solve removing object that is shared among others

我有这种情况:

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

或如何称呼此机制,以便我可以“ google”更多信息。

(编辑:意外的错误主意已删除)

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

您的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
}

当共享指针脱离引用而释放时,这将防止使用该对象。

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

最后,最后一个选择是制作一些notify()方法,以通知所有B对象某些A对象已删除,尽管这将需要大量的修改,并且实际上不是最佳解决方案。

希望对您有所帮助:)

这基本上是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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM