对象在析构函数中的作用域

时间:2012-06-29 11:17:51

标签: c++ oop destructor

我想了解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只是一个简单的课程。

由于

4 个答案:

答案 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以了解范围