c++ - 析构函数调用
问题描述
我是 C++ 新手,目前正在学习它。
当我在探索网络和问题时,我遇到了下一个代码:
class A
{
public:
~A() { cout << "A"; }
};
class B
{
public:
~B() { cout << "B"; }
};
int main()
{
A a;
B b;
return 0;
}
输出如下所示:
文学学士
有人可以解释为什么输出看起来像这样吗?
解决方案
清理其他答案中的神话:不,清理顺序与堆栈无关。
C++ 标准甚至没有定义堆栈的概念,除非有两种情况:
- 堆栈展开(作为一个过程)。
- 堆栈容器适配器。
这两者都不相关。相关的是第 6.6 节:
从范围退出时(无论如何完成),已在该范围内构建的具有自动存储持续时间的对象将按其构建的相反顺序销毁。
转移出循环、转移出块或返回具有自动存储持续时间的初始化变量涉及销毁具有自动存储持续时间的对象,这些对象在转移点的范围内但不在转移点的范围内。
大多数架构使用执行堆栈来实现此行为的事实是“巧合”,但标准并未强制要求。
另一方面,无论实现是否使用堆栈,都可以保证逆序销毁。
推荐阅读
- python - Pandas: How to efficiently select rows based on string subsets
- mysql - MySQL WorkBench 和 SQL WorkBench 的核心区别是什么?
- react-native - How to stop react native animation inside 'onPanResponderMove' when a certain condition is met?
- dialog - Alexa Node JS:使用 Dialog.Delegate 和对话框状态不会更改为 COMPLETE
- javascript - 检查使用 lodash 嵌套的对象中是否存在方法
- syslog - NXLog 总是在磁盘上转发文件(即使它没有改变)
- php - PHP ImagickDraw 线程化
- java - 如何将值从一个网站转移到另一个网站(Spring Boot - Angular)?
- java - 使用 ResultSet.getString() 或 ResultSet.getTimestamp() 获取时间戳更好吗?
- mysql - 如何将一个容器中的 mysql 数据库绑定到另一个运行我的 django 博客应用程序的容器(使用 docker-compose)