2013-05-16 115 views
2

問題我有這樣的代碼:C++,與析構函數

#include <iostream> 

using namespace std; 

class X 
{ 
    int a; 
public: 
    X() 
    { 
     cout<<"X constructor was called"<<endl; 
    } 
    X(int n) 
    { 
     cout<<"X(int) constructor was called"<<endl; 
    } 
    ~X(){cout<<"X dectructor was called"<<endl;} 
}; 
int main() 
{ 
    X x(3); 

    system("PAUSE"); 

    return 0; 
} 

這個代碼執行的結果:X(int)構造被調用。 但爲什麼析構函數消息尚未打印?

據我所知,我們通過調用構造函數X(int)來創建對象x,並且在程序結束時這個對象必須被刪除,但是它沒有。

+1

您是否嘗試過調試並在析構函數中放置一個斷點? –

回答

3

,因爲它是在堆棧中分配,析構函數應該在這裏呼籲:

int main() 
{ 
    X x(3); 

    system("PAUSE"); 

    return 0; 
} // X destructor (x go out of context) 
1

析構函數將不會被調用,直到對象超出範圍,並且直到您退出主要纔會發生。

這就是爲什麼消息不會彈出:控制檯消失了,當對象消失了。

2

析構函數在對象超出作用域時運行。我猜你把system("pause")看到它的消息。那麼沒有,x的範圍還沒有結束,它在return 0;後結束。

從終端運行你的程序,看看你自己。

1

試試這個:

int main() 
{ 
    { 
     X x(3); 
    } // Your x object is being destroyed here 

    system("PAUSE"); 

    return 0; 
} 

它將爲X局部範圍,讓你看到X遭到破壞。