2015-06-28 51 views
1

考慮的以下代碼:訂單破壞堆棧/堆分配數組

struct A{...}; 

A a[100]; 
A* pa = new A[100]; 
delete[] pa; 

是破壞了由標準定義的的a/pa元件的順序,或者它被實現定義(對於第二種情況operator delete[]不是用戶定義的)。

回答

3

數組元素將在施工的相反的順序破壞,與元件99是第一破壞,然後元件989796 ...等和元件0是最後。

查看isocpp析構函數FAQ。

從最新的草案5.3.5.6:

如果刪除表達式的操作數的值不是一個空指針值,刪除表達式將 調用析構函數(如果有的話)用於刪除數組中的對象或元素。 對於 數組,元素將按照地址遞減的順序銷燬(即按照構造函數的完成 ;請參閱12.6.2)的順序銷燬元素。

還有這從12.6.3(這是不特定的delete關鍵字):

當類對象的數組進行初始化(顯式或隱式地)和元素初始化 通過構造函數,應該按照下標順序爲數組的每個元素調用構造函數; 見8.3.4。 [注意:數組元素的析構函數按其構造的相反順序調用。 - 結束 備註]