C++ 检测对象是否仍处于活动状态或已被销毁
假设我有一门课:C++ 检测对象是否仍处于活动状态或已被销毁,c++,C++,假设我有一门课: class Foo { public: int a; } 该类通过类栏的对象B通过new操作符实例化,并通过delete操作符销毁 若类Bar的对象B实例化了类Foo的新对象A,然后它将对象A的指针传递给类Baz的C的对象。如果Baz类的对象B已自删除,那么Baz类的对象C如何检测对象A是否处于活动状态或已被删除。注意:这是在一个非常小的嵌入式系统上,因此不能使用库,甚至不能使用std。请参见下面的序列图 |------|
class Foo {
public:
int a;
}
该类通过类栏的对象B通过new
操作符实例化,并通过delete
操作符销毁
若类Bar的对象B实例化了类Foo的新对象A,然后它将对象A的指针传递给类Baz的C的对象。如果Baz类的对象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 ?)
两种选择:
- 如果您只需要知道,请使用
变量,该变量表示对象是否仍然存在std::atomic
- 相反,如果onject C仍然需要访问该对象,请使用智能指针
一个更实用的方法是已经指出的弱ptr,或者一个信号和插槽组合来通知感兴趣的对象A的破坏。您可以使用B的析构函数调用
C:Buz.set_foo_ptr(nullptr)然后C可以在使用nullptr之前测试它。您在这里遇到了所有权问题。通常,您会使用一个stl智能指针来处理此问题,但正如您所说的,没有stl。。。您必须非常仔细和明确地管理指针的所有权
在没有封闭对象的情况下传递指向对象的指针是个坏主意。现在你C拥有A,但B也拥有A。这不好。将B传递给C并让C通过B访问A,或者提供访问器函数。或者将A传递给C,并确保C是管理A的唯一对象(即C将删除所有A对象)
我想如果你必须的话,你可以用B来包含一个标志,确定谁拥有a的所有权-默认情况下,它被设置为“B”,但一旦通过它,可以设置为“C”,并在B被删除时使用它来告诉B是否删除a。似乎是一个很好的选择,因为我不知道标准中提到了这个用法,但是,动态强制转换是否有效(而且可靠)?您是否需要它不被删除?或者说删除是可以的?你的问题是你正在创建和分发指针,但是没有一个实体负责销毁它们。这就是为什么我们有std::shared_ptr和std::weak_ptr。这个Q有点类似于…,希望这能帮助uThanks,这就是我的想法,但希望得到更多的输入。我在问一个后续问题:。所以在问了第二个问题之后,@gbjbaanb正在引导我朝着更好的方向前进,所以我将标记他作为答案,给你们一个向上的投票,谢谢……没问题;有时,你的问题会有更好的解决办法。Stackoverflow不是甲骨文,尽管它非常非常接近:)