2011-05-20 77 views
2

我有一個函數返回一個本地對象:爲什麼我的本地對象摧毀了兩次?

class AT 
{ 
public: 
    AT() { cout<<"construct"<<endl; } 

    AT(const AT& at) { cout<<"copy"<<endl; } 

    ~AT() { cout<<"destroy"<<endl; } 
}; 

AT funcAt() 
{ 
    AT tmp; 
    return tmp; 
} 
... 
funcAt(); 

輸出爲:

construct 
copy 
destroy 
destroy 

我想有隻建設和「TMP」的破壞,所以爲什麼會出現複製和其他破壞?複製的對象在哪裏?

+0

沒有C++對象可以銷燬(或創建)兩次。 – 2011-05-20 17:03:33

+0

如果在啓用優化的情況下運行發佈版本,我將保證輸出更改。 – ildjarn 2011-05-20 17:24:25

+0

@尼爾:我敢打賭,我可以創建和銷燬同一個對象兩次。 (作者:迂腐的警察) – 2011-05-20 17:37:03

回答

1

因爲它是

1)的創建:AT tmp內部funcAt
2)複製:return tmp;,這是因爲該函數返回一個拷貝:AT funcAt()
3)破壞 - 第一TMP對象,並返回複製

提示:注意在輸出:)

+0

我明白你的意思,但你需要清理這個以指定兩個對象正在銷燬,而不是兩次。 – 2011-05-20 17:03:15

+0

我的回答還沒有準備好,無意中發佈了。我編輯過。 – 2011-05-20 17:05:45

0

你的函數的返回值是一個單獨的對象(即複製)到本地對象copy使用在函數內部。

1

爲什麼因爲tmp的副本從funcAt返回,不存儲,因此C++破壞它,並呼籲

+1

「我在任何地方都保存過」對初學者來說有點困惑,我想。它並沒有真正描繪發生的事情。 – 2011-05-20 17:05:39

+0

@San我切換保存到存儲。想不到比這更好的詞 – JaredPar 2011-05-20 17:06:44

1

tmp構造和銷燬的析構函數的原因。返回值(這是一個新的對象,而不僅僅是一個引用)也是如此,儘管這裏使用了cop構造函數。您沒有看到正在使用的返回值,但它仍然通過。

8

讓我們充實了這一點一點:

AT funcAt() 
{ 
    AT tmp;   [1] 
    return tmp;  [2] 
}      [3] 
... 
funcAt();    [4] 

[1]在TMP
創建一個AT對象 [2]複製TMP成返回值
[3]破壞TMP
[4]破壞返回值,因爲它沒有被使用

相關問題