检测对象是否仍处于活动状态或已被销毁

Detecting if an object is still active or it has been destroyed

本文关键字:活动状态 对象 是否 检测      更新时间:2023-10-16

假设我有一个类:

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 ?)

此处存在所有权问题。通常,您会使用一个stl智能指针来处理此问题,但正如您所说,没有stl。。。您必须非常谨慎和明确地管理指针的所有权。

在没有封闭对象的情况下传递指向a的指针是个坏主意。现在你C拥有A,但B也拥有A。这不好。将B传递给C,让C通过B访问A,或者提供访问器函数。或者将A传递给C,并确保C是唯一管理A的对象(即C将删除所有A对象)。

我想如果必须的话,你可以包括一个带B的标志,它决定谁拥有a的所有权——默认情况下,它被设置为"B",但一旦传递,它就可以被设置为"C",当B被删除时,它用来告诉B是否删除a。

好吧,根据定义,你不能,因为被破坏的对象已经不在了。你无法检查不存在的。。。

一种更实用的方法是已经指出的weak_ptr,或者信号&插槽组合通知感兴趣的对象A.的销毁

您可以使用B的析构函数来调用C:Buz.set_foo_Ptr(nullptr);,然后C可以在使用之前测试nullptr。

两个选项:

  • 如果您只需要知道,请使用std::atomic<bool>变量来说明对象是否仍然存在
  • 相反,如果onjectC仍然需要访问该对象,请使用智能指针
相关文章: