析构函数如何执行?

How Destructor executes?

本文关键字:执行 何执行 析构函数      更新时间:2023-10-16

我在析构函数上做了实践,但是在编译这个程序时,我不知道为什么输出没有像我想象的那样出现。

#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的非数组。所以我无法回答这个问题。阅读更多内容 删除和删除 [] 删除数组时相同吗?