析构函数调用

时间:2018-10-28 14:00:48

标签: c++ oop c++11 object

我是C ++的新手,目前正在学习它。
在探索网络和问题时,我遇到了下一个代码:

class A
{
    public:
    ~A() { cout << "A"; }

};

class B
{
    public:
        ~B() { cout << "B"; }
};


int main()
{
    A a;
    B b;

    return 0;
}

输出如下:

  

BA

有人可以解释为什么输出看起来像这样吗?

3 个答案:

答案 0 :(得分:6)

清除其他答案中的神话:不,清除顺序与堆栈无关。

除了两种情况外,C ++标准甚至没有定义堆栈的概念:

  • 堆栈展开(作为一个过程)。
  • 堆栈容器适配器。

在这里都不相关。与相关的是第6.6节:

  

从范围退出(但已完成)时,具有自动对象   在该范围内构造的存储期限为   破坏了以与建造相反的顺序

     

传送出循环,块外或返回经过初始化的   具有自动存储期限的变量会破坏   具有自动存储持续时间的对象在当前范围内   转移但不是转移到该点。

大多数体系结构使用执行堆栈来实现此行为的事实是“快乐的巧合”,但这不是标准强制要求的。

另一方面,无论实现是否使用堆栈,都可以保证逆向销毁

答案 1 :(得分:3)

对象按照创建时的相反顺序销毁。

答案 2 :(得分:0)

如果使用new关键字创建了函数中的对象,则会在堆中为其分配内存。Dynamic Memory

如果函数中的对象不是使用new关键字创建的,则它们会在堆栈中分配内存(尽管c ++并不要求使用堆栈)。

int main( )
{
    A a;
    B b;
} 

在上述情况下,B在A的顶部。因此,一旦函数结束,它将首先被销毁。我们调用析构函数销毁内存分配。 more

其他资源:similar question