2012-06-29 110 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得到理解有關範圍