什么时候在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"; 
} 

每个对象的范围是什么?

+0

两者你有没有尝试实际编译和运行代码的对象

“删除”破坏? – fukanchik

+1

http://*.com/questions/10080935/when-is-an-object-out-of-scope – Balu

+0

按顺序执行此操作: 构造函数被调用:demo d1 - > demo d2 - > demo d3 - >演示d4。 析构函数被调用: - > demo d3 - > demo d2 - > demo d4 - > demo d1。 发生的原因是,这是因为每个{}在栈帧上都有自己的一组开始和结束地址。每次遇到新对象时,都会在必要范围({})下创建。当你离开这个范围时,它被析构函数调用(除非它被分配,或者被配置为一个静态变量)。因此,每一个的输出: –

对象的范围是当它离开已声明它的{ }时。这适用于局部变量,不适用于静态和全局变量。

在您的示例中,对象将按以下顺序离开作用域:d3d2d4d1。请注意,d1d4处于相同范围内,删除同一范围内对象的规则与分配的顺序相反。

C++中的对象可以在堆栈上或在堆上创建。

堆栈帧(或范围)由语句定义。这可以像功能一样大或像流量控制块一样小(while/if/for等)。包含任意代码块的任意{}对也构成一个堆栈帧。一旦程序退出该框架,框架内定义的任何局部变量都将超出范围。当一个堆栈变量超出范围时,它的析构函数被调用。

当堆被创建,它应该通过调用从post