2012-04-26 33 views
1

我真的很難學習取消「其他」對象,我剛剛閱讀了關於移動語義的整篇文章here,我很失望,因爲它不包括取消。我真的必須在移動構造函數/移動asigment或只是指針的所有成員無效?

請解釋一下我們是否真的需要取消所有「其他」的成員或只是指向動態分配內存的指針?

爲什麼我們會關心取消不在堆中的成員(其他對象)?有什麼好的理由?

+0

我不認爲「無效」是一個詞。也許這是一個法律術語或什麼的。 – 2012-04-26 19:52:42

+0

不能準確地說,但我猜是因爲堆分配是由用戶完成它的職責來釋放它。當對象被實際刪除時,對象內其他成員的其他成員在獲得這樣的指令時將被操作系統釋放。 Nullify是爲了克服晃來晃去的指針,當程序員錯誤地使用時會產生問題。它確保引用一個明確的指針實際上會導致核心轉儲,並且很容易通過生成的核心來查找錯誤 – Invictus 2012-04-26 19:55:42

+2

@KerrekSB:「無效」當然是一個詞......而不是任何行業特定的俚語。 – 2012-04-26 19:56:13

回答

3

從對象中移出後,其析構函數在清理完畢後仍然會被調用。這意味着它需要知道它是否應該釋放它擁有的資源,因此它們需要被取消(或者不管你怎麼稱呼它!),所以指針不會被雙重刪除等。

+0

但是,析構函數只釋放堆分配的數據,而不是堆棧分配的數據,並且我在網上看到很多示例,不僅指向堆而是指向所有成員。爲什麼都是?這是真實的,我不明白爲什麼普通數據應該被廢棄。 – codekiddy 2012-04-26 20:06:51

+0

@codekiddy你只需要確保移動的對象的析構函數不會清理它不應該的東西。你可以通過將stuff填入null並確保析構函數爲此做好準備,或者你可以通過使用'bool empty;'成員並用'if(!empty){}'包裝析構函數來實現。無論如何,只要你不會最終摧毀同一資源兩次。 – 2012-04-26 20:07:43

+1

不正確。在堆棧中分配的對象也會調用析構函數。通常你不需要清除純數據成員,除非他們將以某種方式在析構函數中使用。這樣做並不是真的不正確,可能不必要。 – Peter 2012-04-26 20:09:15

2

您需要將有效狀態爲的對象從中移出。我認爲這意味着沒有使用該對象應該導致未定義的行爲。實際上,這意味着不要離開指向已釋放內存的指針。我可以想象,可能還有其他場景,比如對象是否支持其他資源(打開套接字,文件等等)。

+0

是的,但爲什麼要像int這樣的純數據無效例如? int在堆棧中只是一個int,析構函數根本不會觸及那個int,所以爲什麼我們會關心取消那個int? – codekiddy 2012-04-26 19:59:43

+0

你不應該在意int。除非你的設計是可以讓人來的,否則檢查整數,並根據其結果根據你的設計做一些不應該做的事情。但這是一個遙不可及的場景。您無法取消值。 – juanchopanza 2012-04-26 20:01:24

0

我不知道如果你真的是這個意思,只是構造函數,或者即使動態分配正常指針。

但是,指針的Nullyfing將它保存爲Dangling pointer,因爲它在爲其分配的內存空閒後指向空值。進一步使用這些指針並對這些指針進行解引用會導致核心轉儲,這些轉儲比沒有這樣做時易於定位。不這樣做可能會產生意想不到的結果,導致核心轉儲難以發現,甚至導致數據損壞。

總之,你應該只照顧指針。

0

像往常一樣,「這取決於」。

移動的對象仍然必須銷燬,或者可能會分配一個新的值。您必須將其置於這些操作可行的狀態。

如果您有「被盜」指向動態數據的指針,您可能必須將null指定給原始指針,以便它們可以被刪除。如果其中一個整數成員持有指向的對象的大小,則可能必須將其置零(以與空指針保持一致)。其他值可能會保留原樣。

相關問題