2009-07-14 155 views
3

如果我初始化一個放置新的POD類,我可以假設內存將被默認初始化(爲零)嗎? This resource明確指出,如果顯式調用零參數默認構造函數,將默認初始化這些字段,但不清楚這是否將使用placement new(傳遞地址)的默認實現保持true。在這種情況下是否將內存的標準行爲歸零?POD類初始化與安置新的默認初始化?

+0

該文件已過時。在'03標準修訂版本中,`new T();`用於POD,非POD用戶聲明構造函數的值爲初始化,而非默認初始化。你會發現在C++中初始化是一團糟。我希望SO會有桌面支持 – 2009-07-14 15:41:49

+0

呃......我明白你在說什麼。我剛剛發現這個錯誤: http://qc.embarcadero.com/wc/qcmain.aspx?d=51854 雖然我讀得越多,它似乎應該是零初始化越多.. – elecengin 2009-07-14 15:49:15

回答

3

從一開始:

5.3.4/15:

  • 如果新初始化是形式()的,則產品的值初始化(8.5);

8.5/5:

值初始化類型T的對象是指:

  • 如果T是一個類類型(第9節)與用戶聲明的構造函數(12.1),那麼調用T的默認構造函數(並且如果T沒有可訪問的默認構造函數,則初始化不合格);如果T是一個沒有用戶聲明構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都被初始化;

  • 如果T是一個數組類型,那麼每個元素都是值初始化的;

  • 否則,對象初始化爲零

因爲你有一個POD類型的第一顆子彈在這裏並不適用,因此,你不能有一個用戶聲明的構造。您的類型的成員只能是POD類型,如int,float等,或者也是POD或POD類型的數組的嵌套結構。因此,最終每個人都會在最後的項目符號上結束:「否則,對象將被初始化爲零」。

此初始化發生是因爲POD類在您提供的內存中初始化。內存是由操作系統分配的還是您提供的地址無關緊要。

所以,恕我直言,答案是肯定的 - 成員將零初始化。