2010-03-03 24 views
1

我知道當構造函數失敗時,已完成的成員對象將被銷燬。沒有內存泄漏。構造函數如何失敗以銷燬完成的對象?

我的問題是,編譯器如何做到這一點?編譯器如何知道構件是什麼構件?它是否記錄了它?在這種情況下,編譯器是否真的銷燬了一切?它如何保證這一點?

+1

請參閱http://stackoverflow.com/questions/188693/is-the-destructor-called-if-the-constructor-throws-an-exception。 –

+0

與清理函數局部變量(包括早期返回和異常情況)真的有很大區別嗎?你爲什麼需要知道? – UncleBens

回答

4

編譯器如何做到這一點取決於編譯器。

但是,您可以保證任何構造的對象都會被破壞(按照它們構造的相反順序)。 §15.2/ 2:

被部分構造或部分被毀將對所有其完全構造子對象執行時,即析構函數,對於子對象的量,構造已經完成執行和析構函數還沒有一個目的開始執行。如果自動數組元素的構造函數拋出異常,那麼只有該數組的構造元素將被銷燬。如果對象或數組是用新表達式分配的,則會調用匹配的釋放函數(3.7.3.2,5.3.4,12.5)(如果有),以釋放該對象佔用的存儲空間。