2
A
回答
9
不,POD類型在由new
創建時未被初始化。你可以他們的價值初始化爲零,如果你想:
char * p = new char[100]();
^^
這是由標準規定:
C++ 11 5.3.4/15:如果新初始化被忽略,該對象是默認初始化(8.5);如果沒有執行初始化,則該對象具有不確定的值。
8.5/6:向缺省初始化類型T的對象是指:
- 如果T是一個(可能是CV-合格)類型(第9節),T的默認構造函數被調用(和如果T沒有可訪問的默認構造函數,則初始化不合格);
- 如果T是陣列類型,則每個元素是默認初始化;
- 否則,不執行初始化。
您的其他觀察:
GCC似乎呼籲每個字符
它不應該做的默認構造函數 - 尤其是char
沒有一個構造函數。如果將其替換爲具有默認構造函數的類型,那麼將爲每個元素調用將。
我得到以下拆卸,沒有任何初始化的跡象:
int main() {
char * p = new char[100];
return p[0];
}
00000000004005f4 <main>:
# set up stack frame
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
# call `operator new[]` with an argument of 100
mov $0x64,%edi
callq 4004e0 <operator new[](unsigned long)@plt>
# put the return value into %eax
mov %rax,-0x8(%rbp)
mov -0x8(%rbp),%rax
movzbl (%rax),%eax
movsbl %al,%eax
# return
leaveq
retq
相關問題
- 1. 應用需要刷新初始化
- 2. 基元需要初始化爲零嗎?
- 3. 使用新的,使得它們不被初始化爲NULL
- 4. C++結構不編譯...未正確初始化?不正確使用它們?
- 5. 用來初始化用零
- 6. 我在使用它們之前是否需要初始化結構的值?
- 7. 我需要初始化新視圖嗎?
- 8. 爲什麼不需要使用「新」來初始化std :: vector?
- 9. 編譯器返回未初始化值
- 10. 使用未初始化的變量 - 編譯器中斷
- 11. g ++編譯器中的「未初始化的使用」警告
- 12. GCC編譯器錯誤,'p_data'可能未初始化使用
- 13. 如何使用C++(g ++編譯器)初始化unorderd_set?
- 14. 需要初始化JFrame
- 15. 需要初始化對象
- 16. 爲什麼我需要初始化varible類時,我想用它
- 17. 「Flex用戶將需要下載最初的AIR SDK,而無需使用新的編譯器。」?
- 18. #include <initializer_list>需要使用基於範圍的初始化器列表嗎?
- 19. 爲什麼字符串需要用初始值初始化?
- 20. 無法初始化編譯器:在編譯器鏡對象java.lang.Object中未找到
- 21. 編譯器錯誤:「非聚合不能使用初始化器列表進行初始化。」
- 22. 使用Tubolinks重新初始化trix編輯器
- 23. 創建一個ZipFile,需要初始化,但初始化需要處理異常
- 24. 默認初始化器需要不需要可變的特性
- 25. 無法初始化字符串數組,並使用它們
- 26. 零重新初始化在C++
- 27. 由編譯器將C++指針初始化爲空
- 28. 數組初始化需要大括號初始化列表
- 29. Visual Studio 2005:是否有編譯器選項將所有基於棧的變量初始化爲零?
- 30. VS 2008用於標記未初始化變量的編譯器選項
+1的^^ :) – vulkanino 2012-02-29 16:27:50
是否有標準的任何地方它明確規定呢? – 2012-02-29 16:31:19
@MichaelGoldshteyn:確實存在;我會在一分鐘內查找它。 – 2012-02-29 16:34:55