我想了解Destructor。我遇到了以下问题。在下面的代码片段中,为什么对象b2超出了Destructor的范围?
class D
{
B *b1;
public:
D()
{
b1 = new B;
B *b2=new B;
cout<<"D's Constructor Invoked"<<endl;
//delete b2;
}
~D()
{
delete b1;
delete b2; // error : undeclared identifier
cout<<"D's Destructor Invoked"<<endl;
}
};
B只是一个简单的课程。
由于
答案 0 :(得分:2)
b2
是构造函数的局部变量。你要做的事基本上等同于:
void f()
{
B *b2=new B;
}
void g()
{
delete b2; // error : undeclared identifier
}
我想你明白为什么它不起作用。 (g
有自己的范围和自己的局部变量集,与f
的变量不相交。)
相反,将b2
设为成员变量:
class D
{
B *b1;
B *b2;
public:
D()
{
b1 = new B;
b2 = new B;
cout<<"D's Constructor Invoked"<<endl;
}
~D()
{
delete b1;
delete b2; // works!
cout<<"D's Destructor Invoked"<<endl;
}
};
答案 1 :(得分:1)
因为它是另一个函数中的局部变量。这与以下不编译的原因相同:
void do_something() {
int answer = 42;
frob(answer);
}
void do_something_else_completely_unrelated() {
answer = 23; // what? there's no "answer" in scope!
}
答案 2 :(得分:0)
b2
的范围是你声明它的块,它是构造函数。
答案 3 :(得分:0)
对象b2在构造函数(本地)内定义,这意味着它不能在大括号外访问}。所以你的析构函数没有任何关于b2存在的线索。而b1是作为类成员创建的,因此它是可见的。
阅读this以了解范围