首页 > 解决方案 > 析构函数调用

问题描述

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

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

};

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


int main()
{
    A a;
    B b;

    return 0;
}

输出如下所示:

文学学士

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

标签: c++oopc++11object

解决方案


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

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

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

这两者都不相关。相关的是第 6.6 节:

从范围退出时(无论如何完成),已在该范围内构建的具有自动存储持续时间的对象将按其构建的相反顺序销毁。

转移出循环、转移出块或返回具有自动存储持续时间的初始化变量涉及销毁具有自动存储持续时间的对象,这些对象在转移点的范围内但不在转移点的范围内。

大多数架构使用执行堆栈来实现此行为的事实是“巧合”,但标准并未强制要求。

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


推荐阅读