析构函数如何执行?
How Destructor executes?
我在析构函数上做了实践,但是在编译这个程序时,我不知道为什么输出没有像我想象的那样出现。
#include <iostream>
using namespace std;
class aaa
{
private:
static int x;
int code;
public:
/*after constructor executes 3 times the value of "code" becomes 103*/
aaa()
{
code=x;
cout<<"Default Constructor"<<endl;
x++;
}
~aaa()
{
cout<<"Destructor of "<<code<<endl;
}
};
int aaa::x=101;
int main()
{
aaa *p;
p=new aaa[3];
delete []p;
return 0;
}
输出为:
Default Constructor
Default Constructor
Default Constructor
Destructor of 103
Destructor of 102
Destructor of 101
虽然我以为会是这样的:
101
102
103
销毁以与构造相反的顺序发生,这就是为什么您看到 103 的析构函数首先调用的原因。
即,当你分配数组时,new[]
在一个方向上构造对象,然后当你调用delete[]
对象时,对象从数组的末尾被销毁。
请参阅 @StoryTeller 的答案,了解有关此行为的 C++ 标准中的引用。
析构函数的调用顺序与对象初始化相反,对于被delete[]
销毁的数组也是如此:
[删除/6]
如果删除表达式的操作数的值不是空值 指针值,则删除表达式将调用析构函数(如果 any) 表示要删除的对象或数组的元素。在 如果是数组,元素将按以下顺序销毁 递减地址(即,按完成的相反顺序 它们的构造函数;参见 [class.base.init])。
我不知道
为什么输出没有像我想象的那样出现。
因为物品的破坏顺序与构造相反:首先建造,最后销毁。
析构函数的调用顺序与构造函数的调用顺序相反,这解释了您看到的行为。
因此,当您为数组动态分配具有new[]
的内存时,构造函数按自然顺序(您期望的顺序)调用,但是当调用delete[]
以释放该内存时,数组的每个元素都会以相反的顺序被破坏。
阅读更多内容,请参阅为什么不以相反顺序为对象数组调用析构函数?
如果我写
delete p
而不是delete []p
会发生什么,所以很多时候都叫析构函数?
C++要求您删除带delete[]
的数组,并删除带delete
的非数组。所以我无法回答这个问题。阅读更多内容 删除和删除 [] 删除数组时相同吗?
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 如何在C++中执行以前执行的代码行
- 为什么我的虚拟破坏者多次执行这些执行
- 如何标识其功能当前正由可执行文件执行的共享库
- 打印C 代码执行逐步执行
- 从编译的可执行文件执行函数
- 当程序执行取决于执行顺序时,是否是未定义的行为
- 在.so内部定义的extern变量和可执行引线执行未定义的行为
- 等待执行不可执行脚本的子进程
- 调试与发布可执行文件有何不同?