我知道只要对象超出范围或已删除,编译器会自动调用析构函数,但我如何知道对象的范围?
例如在这段代码中:
#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 :(得分:0)
对象的范围是它离开声明它的{ }
时的范围。这适用于局部变量,不适用于静态变量和全局变量。
在您的示例中,对象将按以下顺序离开作用域:d3
d2
d4
和d1
。请注意d1
和d4
在同一范围内,删除相同范围内对象的规则与分配的顺序相反。
答案 1 :(得分:0)
可以在堆栈上或堆上创建C ++中的对象。
堆栈框架(或范围)由语句定义。这可以像函数一样大,也可以像流控制块那样小(而/ if /等等)。包含任意代码块的任意{}对也构成堆栈帧。一旦程序退出该帧,框架内定义的任何局部变量都将超出范围。当堆栈变量超出范围时,将调用其析构函数。
在堆中创建它时,应该通过在对象上调用“delete”来销毁它
取自post