【问题标题】:Why does a "child" object destructor execute after the "parent" object destructor?为什么“子”对象析构函数在“父”对象析构函数之后执行?
【发布时间】:2021-06-30 06:06:13
【问题描述】:

我有一个班级(“父母”),它有另一个班级(“孩子”)作为成员:

class Engine   // THE "PARENT" CLASS
{
    public:
        // CONSTRUCTOR ------------------------------------
        Engine() : mConfig {}  // "CHILD" CLASS INITIALIZED HERE
        {
            // ...
            return;
        }

        // DESTRUCTOR -------------------------------------
        ~Engine()
        {
            std::cout << "Engine destructor executing...\n";
            // ...
            return;
        }

    private:
        GameConfig  mConfig;  // THE "CHILD" CLASS AS MEMBER OF "PARENT"
};

“子”类定义为:

class GameConfig   // THE "CHILD" CLASS DEFINITION
{
    public:
        // ...
        // DESTRUCTOR -------------------------------------
        ~GameConfig()
        {
            std::cout << "Writing config data...\n";
            // ...
            return;
        }
};

我在 main 中实例化“父”类,然后(通过初始化列表)实例化“子”类:

int main()
{
    Engine gameEngine {};
    // ...
    std::cout << "Goodbye!\n";

    return(0);
}

根据 SO 上的this question 问题,从逻辑上讲,我认为“子”对象的析构函数会在“父”对象的析构函数之前调用。但是,当我执行这段代码时,输​​出是:

Goodbye!
Engine destructor executing...
Writing config data...

所以问题是:为什么“子”对象析构函数在“父”对象析构函数之后执行?

【问题讨论】:

  • 如果成员在进入包含类的析构函数之前被销毁,包含类的析构函数将无法对它们做任何事情。
  • 代码中的父子关系在哪里?
  • @jamesdlin 我明白了,这很清楚为什么。对于非初学者来说似乎很明显,事后看来,当然。我可以问为什么不将您的评论作为答案吗?
  • @Someprogrammerdude 那篇文章确实解释了破坏的顺序,但没有解释为什么,这是我的问题

标签: c++ object destructor


【解决方案1】:

(我将避免使用“父”和“子”,因为这些术语通常指的是通过继承而不是组合相关的类。)

销毁 C++ 对象涉及执行其析构函数体和编译器自动生成的其他销毁工作,例如销毁成员对象和调用基类析构函数。

必须在调用析构函数的主体后进行额外的工作。如果它发生在之前,包含对象的析构函数将无法对其成员执行任何操作,这在大多数情况下会使析构函数无用。

【讨论】:

  • 了解“子”和“父”术语。我缺乏更好的术语,因此我在整个问题中将这些词放在引号中。似乎我经常因为不知道我想学什么而受到惩罚。谢谢你的解释。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 2016-02-10
  • 2019-12-30
  • 2011-06-17
  • 2016-01-26
  • 1970-01-01
  • 2010-10-16
  • 2010-10-08
相关资源
最近更新 更多