我是否必须按顺序显式销毁对象

Zeb*_*ish 4 c++ struct destructor class

我知道,当为您提供隐式构造函数时,您的类成员将从左到右,从上到下进行初始化.换句话说,按照它们被声明的顺序.然后当类对象超出范围时,所有成员都以相反的顺序被破坏.但是,如果我必须自己摧毁成员,我必须按照它们列出的确切顺序进行吗?例如:

struct Dog {};

struct Animal
{
    Dog* dog1 = new Dog;
    Dog* dog2 = new Dog;
    ~Animal() 
    {
        delete dog2;     // First delete dog2
        delete dog1;     // Then delete dog1
    // Or do I?
    }
};
Run Code Online (Sandbox Code Playgroud)

我认为提供的析构函数是空的.因此,当我听到该类在超出范围时将调用其成员的析构函数时,它不会在它自己的析构函数中执行此操作,而是在它之后,使用编译器单独生成的代码?例如:

struct Animal
{
     Dog dog1;
     // ~Animal(){}implicitly defined destructor here. dog1 isn't destroyed here
    // But is destroyed here, or after, or something along those lines with separate code that the compiler generates?

};
Run Code Online (Sandbox Code Playgroud)

谢谢.

Lig*_*ica 5

但是,如果我必须自己摧毁成员,我必须按照它们列出的确切顺序进行吗?

不,按照你喜欢的顺序做.

但我更喜欢匹配"自动"订单,以避免感到惊讶.

我认为提供的析构函数是空的.因此,当我听到该类在超出范围时将调用其成员的析构函数时,它不会在它自己的析构函数中执行此操作,而是在它之后,使用编译器单独生成的代码?

基本上,是的.

执行析构函数体是破坏的一部分.另一部分是对所有成员和基地的破坏.