2012-09-25 36 views
0

根據:http://www.cplusplus.com/doc/tutorial/classes/析構函數不被稱爲

析構函數滿足構造函數的相反功能。它在對象被銷燬時自動調用,或者是因爲它的存在範圍已經完成(例如,如果它被定義爲函數中的局部對象並且函數結束),或者因爲它是動態分配的對象並且它被釋放使用操作符刪除。

示例代碼:

class Something 
    { 
    public: 
     Something() {cout << "construction called" << endl; } 
     ~Something() { cout << "destruction called" << endl; } 
    }; 


    void foo(){ 
     Something *ob = new Something(); 
    } 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     foo(); 
    } 

回答

6

這是真的,但你在動態內存,這意味着它不會被破壞,直到調用delete分配的對象。

因爲它是一個動態分配的對象,它使用操作符delete進行釋放。

您從不稱呼刪除。埃爾戈內存泄漏和多餘的析構函數:

void foo(){ 
    Something *ob = new Something(); 
    delete ob; 
} 

無論此,或簡單地在自動存儲器分配對象:

void foo(){ 
    Something ob; 
} 

或委託存儲器管理到智能指針。

6

在銷燬對象之前調用析構函數。由於您使用new分配對象,因此您必須手動明確銷燬對象,並通過在指向對象的指針上調用delete來釋放其佔用的內存。

如果你已經建立了自動存儲管理的對象,點菜

Something ob; 

的對象將被自動銷燬,析構函數將被稱爲對象走出的範圍時foo回報。