析构函数中对象的作用域

3
我正在尝试理解析构函数。我遇到了以下问题。在下面的片段中,为什么对象b2对于析构函数是超出作用域的呢?
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个回答

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;
   }
};

因此,在这方面,构造函数与普通函数没有任何区别。我认为析构函数应该知道构造函数的变量,因为它们绑定在类内部。 - Swathi Appari

1
因为它是另一个函数中的局部变量。这也是以下代码无法编译的原因:
void do_something() {
    int answer = 42;
    frob(answer);
}

void do_something_else_completely_unrelated() {
    answer = 23; // what? there's no "answer" in scope!
}

0

b2 的作用域是您声明它所在的块,也即是构造函数。


0

对象b2在构造函数内部(局部)定义,这意味着它在大括号}之外是不可访问的。因此,您的析构函数对b2的存在一无所知。而b1作为类成员创建,因此它是可见的。

阅读this以了解作用域的概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接