當使用STL容器時,我不確定默認分配器分配的int是否已歸零。下面的代碼表示「是」的問題:默認分配器zeroize int嗎?
#include <map>
#include <iostream>
int main() {
using namespace std;
map<int, int> m;
cout << m[1234] << endl;
}
由於沒有文件證實這一點,我不敢想當然。
當使用STL容器時,我不確定默認分配器分配的int是否已歸零。下面的代碼表示「是」的問題:默認分配器zeroize int嗎?
#include <map>
#include <iostream>
int main() {
using namespace std;
map<int, int> m;
cout << m[1234] << endl;
}
由於沒有文件證實這一點,我不敢想當然。
你會看到的,std::map::operator[]
裏面執行,如果元素沒有索引的發現,一個新的插入和返回:
ReturnValue = this->insert(where, make_pair(key_value, mapped_type()));
其中mapped_type
是第二類,你的情況int
。所以是的,它被默認初始化爲0
,因爲它被插入爲mapped_type()
。
該標準保證由於使用下標運算符而創建的對象是默認構造的。對於任何特定類的默認構造函數是否將您希望進行歸零的成員置零,取決於該類。對於沒有構造函數的類,成員默認構造,默認構造基本類型等於將它們的版本設置爲「零」。
請注意,這有沒有做分配器! ......假設分配器保持內存不變,除非可能有專用的調試分配器(或者人們編寫的分配器被認爲調零內存可能是好東西,而不是設備隱藏的錯誤),這是非常安全的。 ...並且調試分配器不會將內存調零,而是用可識別的模式填充它(例如,在以十六進制查看時導致0xdeadbeef
)。
+1用於區分分配和其餘清零。 – 2012-03-06 13:52:06
也許這:8.5.5初始值設定 C++標準 - ANSI ISO IEC 14882 2003
要零初始化類型T的對象是指: 如果T是一個標量類型(3.9),該對象設置爲0(零)轉換爲T的值;
根據C++ ISO標準14882:2003,似乎默認分配器模板將使用new int()
來默認初始化int爲0。第8.5章,第-5,7-:
要零初始化類型T的對象是指:
- 如果T是一個標量類型(3.9),該對象被設置爲0(零)轉換爲T的值;
要值初始化類型T的對象是指:
如果T是一個類類型(第9節)與用戶聲明的構造(12。1),那麼調用T的默認構造函數(並且如果T沒有可訪問的默認構造函數,則初始化不合格);如果T是一個沒有用戶聲明構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都被初始化;
如果T是一個數組類型,那麼每個元素都是值初始化的;
否則,該目的是零初始化
要缺省初始化類型T的對象是指:
如果T是一個非POD類類型(第9章),調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化不合格);
如果T是一個數組類型,每個元素都是默認初始化的;
否則,該對象被零初始化。
對象的初始值設定項是一組空括號,即(),應進行值初始化。
在C++ 11 ISO標準草案中也有類似的規則。
分配器將默認構造。這應該是相關的: –
RobH
2012-03-06 13:39:26
或者,從MSDN: –
RobH
2012-03-06 13:41:50
@RobH鏈接不起作用。 – 2012-03-06 13:42:40