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

时间:2015-06-22 14:18:13

标签: c++

假设我有一个班级:

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

4 个答案:

答案 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>变量来说明对象是否仍然存在
  • 相反,如果onject C仍然需要访问该对象,请使用智能指针。

答案 3 :(得分:0)

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