【发布时间】:2018-01-02 00:44:50
【问题描述】:
有没有办法在类析构函数之前调用字段析构函数?
假设我有 2 个类 Small 和 Big,并且 Big 包含 Small 的实例作为其字段:
class Small
{
public:
~Small() {std::cout << "Small destructor" << std::endl;}
};
class Big
{
public:
~Big() {std::cout << "Big destructor" << std::endl;}
private:
Small small;
};
int main()
{
Big big;
}
这当然是在小析构函数之前调用大析构函数:
Big destructor
Small destructor
我需要在Big 析构函数之前调用Small 析构函数,因为它为Big 析构函数做了一些必要的清理工作。
我可以:
- 显式调用
small.~Small()析构函数。 -> 然而,这会调用Small析构函数两次:一次是显式调用,一次是在Big析构函数执行后。 - 有一个
Small*作为字段并在Big析构函数中调用delete small;
我知道我可以在 Small 类中有一个函数来进行清理并在 Big 析构函数中调用它,但我想知道是否有办法反转析构函数的顺序。
有没有更好的方法来做到这一点?
【问题讨论】:
-
我认为没有更好的方法,因为
Small析构函数只有在Big被销毁时才会被调用,因此,在Big析构函数之后。 -
在 big 的析构函数之前调用 small 的析构函数需要什么样的清理?
-
“我需要在大析构函数之前调用小析构函数,因为它为大析构函数做了一些必要的清理工作。”你的设计坏了。问如何修复它,不要问如何忍受损坏的设计。
-
“我需要在大析构函数之前调用小析构函数” - 这听起来像 XY problem - 为什么需要这样做?
-
@nefas 是用来销毁zmq上下文的,小析构函数会关闭一些socket。大的析构函数破坏了zmq上下文,需要关闭所有的socket才能被销毁。
标签: c++ destructor object-destruction