何时用c ++调用析构函数?

时间:2016-07-15 05:40:07

标签: 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";
}

每个对象的范围是什么?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

在堆中创建它时,应该通过在对象上调用“delete”来销毁它

取自post