析构函数调用

Posted

技术标签:

【中文标题】析构函数调用【英文标题】:Destructor calling 【发布时间】:2018-10-28 14:00:48 【问题描述】:

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

class A

    public:
    ~A()  cout << "A"; 

;

class B

    public:
        ~B()  cout << "B"; 
;


int main()

    A a;
    B b;

    return 0;

输出如下:

BA

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

【问题讨论】:

输出有什么不明白的地方? 为什么不是AB?为什么会有输出? 【参考方案1】:

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

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

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

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

从范围退出时(无论如何完成),具有自动 在该范围内构建的存储持续时间是 按照与它们的构造相反的顺序销毁

转移到循环外、块外或回过初始化 具有自动存储期限的变量涉及销毁 在该点范围内具有自动存储持续时间的对象 转移自但不是转移到的点。

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

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

【讨论】:

甚至更多,即使在使用堆栈的实现上 - 它用于函数调用堆栈,它与范围内的生命周期无关。也许对于嵌套范围。 事实上,实际上在 OP 问题的示例中,如果启用了优化,很可能在 main 中根本不会触及堆栈。也许是为了调用 c++ 运行时…… 我是这么认为的,但找不到该信息。谢谢! :)【参考方案2】:

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

【讨论】:

简单优雅的解释。有点缺乏,但是..好的 我必须说我标记它与链接重复,但由于某种原因,它不再出现【参考方案3】:

如果函数中的对象是使用 new 关键字创建的,那么它们会在堆中分配内存。Dynamic Memory

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

int main( )

    A a;
    B b;
 

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

其他资源:similar question

【讨论】:

以上是关于析构函数调用的主要内容,如果未能解决你的问题,请参考以下文章

c++ delete 调用析构函数问题。

在一个派生类对象结束其生命周期时析构函数的调用顺序

虚析构函数

虚析构函数与纯虚函数

c++ 析构函数 是在啥时候执行

05.析构函数