2013-07-12 65 views
4

我對析構函數有一個理解問題。C++ - 錯誤的析構函數被調用

在下面的例子:

#include <iostream> 

using namespace std; 

class X{ 
public: 
    int id; 
    X(int id){ 
     this->id = id; 
    } 
    ~X(){ 
     cout << "destroying " << id; 
    } 

}; 



int main(){ 


    X a(1); 
    a = X(2); 


    while(true); 
    return 0; 

} 

我得到以下輸出:摧毀2

這是完全出乎意料的給我,因爲我認爲,析構函數獲取總是叫,當一個對象停止存在。

但是在本例中,它的對象1停止存在並被對象2所取代。但是不是調用對象1的析構函數,而是調用對象2的析構函數。

有人可以解釋這一點嗎?

+0

a只能在主返回後停止存在,在此期間它永不停止存在,您只能使用op = – PlasmaHH

回答

2

a = X(2); =>表達式調用賦值運算符和a.id數據成員由temporaryobject.id(即,2)初始化即

a = X(2); =>表達式調用由編譯器提供的默認賦值運算符並執行黃油色複製。

X(2)表達創建臨時對象和temporaryobject.id與2

第一次初始化解構得到調用時暫時對象被調用另一個用於一個對象。

5

就你的情況而言,只有一個對象被銷燬 - 即在作業右側的臨時X(2)。原始的X(1)不會被破壞,因爲它會被賦值覆蓋。當它被破壞的時候,它也會打印destroying 2

但是,修改後的X(2)(以X(1)開頭)通過無限循環保持活動狀態,因此它也不會被破壞。刪除無限循環修復了這個問題(demo)。

+0

分配給它這是一個非常好的答案,但在閱讀@ PlasmaHH的評論後我才瞭解它提及賦值運算符。我認爲你也應該在你的回答中提及這一點;)因爲它首先,我認爲(1)應該被銷燬,然後它的記憶中的空間應該填充(2)的新副本。但相反的是,(1)只是被修改爲匹配(2) –

+0

@VanCoding我說「賦值」兩次,假設你知道它是一個運算符:) – dasblinkenlight

+0

我知道,但一個賦值可以得到不同的解釋,正如你所看到的:DI認爲內存被分配,而不是一個函數被調用,將(1)轉換爲(2) –