析构函数调用
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
【讨论】:
以上是关于析构函数调用的主要内容,如果未能解决你的问题,请参考以下文章