假设我有一个班级:
class Foo {
public:
int a;
}
此类通过new
运算符实例化,并通过类{Bar}的对象B通过delete
运算符销毁。
如果是Bar类的对象B,则实例化类Foo的新对象A,然后将对象A的指针传递给类Baz的C对象。如果类Bar的对象B已被自行删除,则类Baz的对象C如何检测对象A是否处于活动状态或已被删除。注意:这是在一个非常小的嵌入式系统上,因此不能使用任何库,甚至不能使用std。请参见下面的序列图。
|------| |------|
| B:Bar| | C:Buz|
|------| |------|
|| |-------| ||
||---New--->| A:Foo | ||
|| |-------| ||
|| || ||
|| || ||
||-----C:Buz.set_foo_Ptr(&A:Foo);----->||
|| || ||
||---Delete--->X ||
|| ||
X (B:Bar Self Deleted) ||
||
(Can C:Buz know if A:Foo
has been deleted or not ?)
答案 0 :(得分:4)
这里有所有权问题。通常你会使用其中一个stl智能指针来处理这个问题,但正如你所说的那样......你将不得不非常仔细地明确地管理指针的所有权。
在没有封闭对象的情况下将指针传递给A是一个坏主意。现在你C拥有A但B也拥有A.这不好。将B传递给C并让C通过B访问A,或者提供访问器功能。或者将A传递给C并确保C是唯一管理A的对象(即C将删除所有A对象)。
我想如果你必须,你可以在B中包含一个标志,确定谁拥有A的所有权 - 默认情况下它被设置为'B'但是一旦通过它就可以设置为'C',并在删除B以告诉B是否删除A.
答案 1 :(得分:1)
嗯,根据定义,你不能,因为已经被摧毁的物体已经不存在了。你无法检查哪些不存在......
更实际的方法是已经指出的weak_ptr,或信号和插槽组合,以通知感兴趣的对象A的销毁。
答案 2 :(得分:0)
两个选项:
std::atomic<bool>
变量来说明对象是否仍然存在答案 3 :(得分:0)
您可以使用B的析构函数调用C:Buz.set_foo_Ptr(nullptr);
,然后C可以在使用之前测试nullptr。