什么时候在C++中调用析构函数?
问题描述:
我知道每当一个对象去超出范围或删除编译器自动调用析构函数,但我怎么知道一个对象的范围?什么时候在C++中调用析构函数?
例如,在此代码中:
#include<iostream>
using namespace std;
class demo
{
static int count;
public:
demo()
{
cout<<"object created"<<++count<<endl;
}
~demo()
{
cout<<"object destroyed"<<count--<<endl;
}
};
int demo::count;
int main()
{
cout<<"in main\n";
demo d1;
{
cout<<"in block 1\n";
demo d2;
{
cout<<"in block 2\n";
demo d3;
}
}
{
cout<<"in block 3\n";
demo d4;
}
cout<<"exit\n";
}
每个对象的范围是什么?
答
对象的范围是当它离开已声明它的{ }
时。这适用于局部变量,不适用于静态和全局变量。
在您的示例中,对象将按以下顺序离开作用域:d3
d2
d4
和d1
。请注意,d1
和d4
处于相同范围内,删除同一范围内对象的规则与分配的顺序相反。
答
C++中的对象可以在堆栈上或在堆上创建。
堆栈帧(或范围)由语句定义。这可以像功能一样大或像流量控制块一样小(while/if/for等)。包含任意代码块的任意{}对也构成一个堆栈帧。一旦程序退出该框架,框架内定义的任何局部变量都将超出范围。当一个堆栈变量超出范围时,它的析构函数被调用。
当堆被创建,它应该通过调用从post
两者你有没有尝试实际编译和运行代码的对象
“删除”破坏? – fukanchik
http://stackoverflow.com/questions/10080935/when-is-an-object-out-of-scope – Balu
按顺序执行此操作: 构造函数被调用:demo d1 - > demo d2 - > demo d3 - >演示d4。 析构函数被调用: - > demo d3 - > demo d2 - > demo d4 - > demo d1。 发生的原因是,这是因为每个{}在栈帧上都有自己的一组开始和结束地址。每次遇到新对象时,都会在必要范围({})下创建。当你离开这个范围时,它被析构函数调用(除非它被分配,或者被配置为一个静态变量)。因此,每一个的输出: –