我有这种情况:
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
或者如何调用此机制,以便我可以“谷歌”更多信息。
答案 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;
}