带返回的 C 析构函数

新手上路,请多包涵

在 C++ 中,如果我们将类析构函数定义为:

 ~Foo(){
   return;
}

调用此析构函数后, Foo 的对象将被销毁,或者从析构函数显式返回是否意味着我们不想销毁它。

我想使某个对象仅通过另一个对象析构函数被销毁,即仅当另一个对象准备好被销毁时。

例子:

 class Class1{
...
Class2* myClass2;
...
};

Class1::~Class1(){
    myClass2->status = FINISHED;
    delete myClass2;
}

Class2::~Class2(){
    if (status != FINISHED) return;
}

我在网上搜索,似乎找不到我的问题的答案。我还尝试通过使用调试器逐步完成一些代码来自己弄清楚,但无法得出结论性的结果。

原文由 Rasula 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 418
2 个回答

不,您不能通过 return 语句阻止对象被破坏,这只是意味着 dtor 的主体的执行将在该点结束。之后它仍然会被销毁(包括它的成员和基),并且内存仍然会被释放。

你可能会抛出异常。

 Class2::~Class2() noexcept(false) {
    if (status != FINISHED) throw some_exception();
}

Class1::~Class1() {
    myClass2->status = FINISHED;
    try {
        delete myClass2;
    } catch (some_exception& e) {
        // what should we do now?
    }
}

请注意,这确实是一个 糟糕 的主意。你最好重新考虑设计,我相信一定有更好的。抛出异常不会阻止其基和成员的破坏,只是可以得到 Class2 的 dtor 的处理结果。可以用它做什么仍然不清楚。

原文由 songyuanyao 发布,翻译遵循 CC BY-SA 4.0 许可协议

从析构函数显式返回是否意味着我们不想销毁它。

不。

析构函数是一个函数,因此您可以在其中使用 return 关键字,但这不会阻止对象的破坏,一旦您在析构函数中,您已经在破坏您的对象,所以任何想要的逻辑防止这种情况发生之前。

出于某种原因,我直觉地认为您的设计问题可以通过 shared_ptr 或者自定义删除器来解决,但这需要有关上述问题的更多信息。

原文由 Drax 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题