2012-06-29 87 views
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只是一个简单的类。

谢谢

回答

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

所以构造没有正常功能的不同在这方面。我认为Destructor应该知道构造函数的变量,因为它们在类中绑定 –

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在构造函数(local)内部定义,这意味着它不能在大括号之外访问}。所以你的析构函数对b2的存在没有任何线索。而b1是作为类成员创建的,因此它是可见的。

this得到理解有关范围