检测对象是否仍处于活动状态或已被销毁
Detecting if an object is still active or it has been destroyed
假设我有一个类:
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仍然需要访问该对象,请使用智能指针
相关文章:
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 在使用 gSoap 链接多个 SOAP 服务时启用保持活动状态
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 如何确定boost msm中的特定状态是否为活动状态
- GCC (libstdc++) 运行时如何在异常处于活动状态时决定终止 ()
- “B1的多重定义”,即使警卫处于活动状态
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 当 /Whorearchive选项处于活动状态时,无法使用Visual Studio链接到Windows上的自构建张量
- IBM Rhapsody c++ 代码生成 - 为什么总是在状态图周围放置一个活动状态
- 暂停游戏OnSteamVR叠加层处于活动状态
- 如何保持异步函数中使用成员的shared_ptr对象的活动状态?
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 过滤器抱怨对象保持活动状态
- 对对象的数据成员的shared_ptr是否使数据成员在对象的生存期之后保持活动状态
- JNI保留对对象的全局引用,并使用其他JNI方法访问它.在多个JNI调用中保持C++对象的活动状态
- 如何保持作为 SWIG shared_ptr传递给非托管代码的托管代码对象的活动状态?
- 使对象保持活动状态时出现问题
- 检测对象是否仍处于活动状态或已被销毁
- 如何使对象保持活动状态以供以后在另一个函数中使用