![](/img/trans.png)
[英]How can I have a local variable that persists over time but is not shared among all members of the same class?
[英]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.