3

我试图理解析构函数。我有以下问题。在下面的代码片段中,为什么对象 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 只是一个简单的类。

谢谢

4

4 回答 4

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;
   }
};
于 2012-06-29T11:19:48.793 回答
1

因为它是另一个函数中的局部变量。这与以下无法编译的原因相同:

void do_something() {
    int answer = 42;
    frob(answer);
}

void do_something_else_completely_unrelated() {
    answer = 23; // what? there's no "answer" in scope!
}
于 2012-06-29T11:19:36.327 回答
0

b2的作用域是你声明它的块,也就是构造函数。

于 2012-06-29T11:19:50.887 回答
0

对象 b2 在构造函数(本地)中定义,这意味着它在大括号 } 之外无法访问。所以你的析构函数对b2的存在没有任何线索。而 b1 是作为类成员创建的,因此它是可见的。

阅读本文以了解范围

于 2012-06-29T11:19:58.230 回答