C++析构函数:未定义的行为与否?

Rav*_*pta 3 c++ destructor

考虑以下代码

#include<iostream>
#include<string>

class A
{
    private:
        char name[10];

    public:
        A() { }
        A(const char *str)
        {
            strcpy(name, str);
            std::cout<<name<<" constructed"<<endl; 
        }
        ~A()
        {
           std::cout<<name<<" destructed"<<endl;
        }
};

int main()
{
   A a("a");
   A b("b");
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下程序的O/P出现:

a constructed
b constructed
b destructed
a destructed
Run Code Online (Sandbox Code Playgroud)

我对上面代码的唯一解释是,自从b创建之后a,它应该存储a在堆栈的上方.现在,当主要完成时,b首先被突然出现,然后a它的析构函数首先被调用然后被调用a.

我的问题是:我是否正确地思考或上述是未定义的行为,并且可能因编译器而异?

Luc*_*ore 11

它没有变化,自动存储器(堆栈)中的对象按照创建它们的相反顺序被破坏.它完全由标准规定.

C++ 03 15.2.构造函数和析构函数

  1. [...]自动对象以完成构造的相反顺序销毁.

  • 还可以想象一下,当您创建对象并将指针或引用传递给下一个对象时.如果销毁顺序未定义或与构造完全相同,则第二个对象将具有无效指针或引用,这将使编程复杂化. (2认同)