Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检测对象是否仍处于活动状态或已被销毁_C++ - Fatal编程技术网

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)您在这里遇到了所有权问题。通常,您会使用一个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不是甲骨文,尽管它非常非常接近:)