2012-03-06 35 views
5

當使用STL容器時,我不確定默認分配器分配的int是否已歸零。下面的代碼表示「是」的問題:默認分配器zeroize int嗎?

#include <map> 
#include <iostream> 

int main() { 
    using namespace std; 
    map<int, int> m; 
    cout << m[1234] << endl; 
} 

由於沒有文件證實這一點,我不敢想當然。

+1

分配器將默認構造。這應該是相關的: RobH 2012-03-06 13:39:26

+0

或者,從MSDN: RobH 2012-03-06 13:41:50

+0

@RobH鏈接不起作用。 – 2012-03-06 13:42:40

回答

6

你會看到的,std::map::operator[]裏面執行,如果元素沒有索引的發現,一個新的插入和返回:

ReturnValue = this->insert(where, make_pair(key_value, mapped_type())); 

其中mapped_type是第二類,你的情況int。所以是的,它被默認初始化爲0,因爲它被插入爲mapped_type()

+0

我知道int會被插入,但我不確定它是否歸零。我不確定'new int'是否會返回0的指針。 – peter 2012-03-06 13:44:29

+0

@peter它不是'new int',它是'int()',它將產生'0'。 – 2012-03-06 13:45:58

+0

@peter:這是另一個問題(不,使用'new int()')。 'std :: map'沒有分配獨立的'int'對象,但是每個都擁有'pair ' – MSalters 2012-03-06 13:47:56

6

該標準保證由於使用下標運算符而創建的對象是默認構造的。對於任何特定類的默認構造函數是否將您希望進行歸零的成員置零,取決於該類。對於沒有構造函數的類,成員默認構造,默認構造基本類型等於將它們的版本設置爲「零」。

請注意,這有沒有做分配器! ......假設分配器保持內存不變,除非可能有專用的調試分配器(或者人們編寫的分配器被認爲調零內存可能是好東西,而不是設備隱藏的錯誤),這是非常安全的。 ...並且調試分配器不會將內存調零,而是用可識別的模式填充它(例如,在以十六進制查看時導致0xdeadbeef)。

+0

+1用於區分分配和其餘清零。 – 2012-03-06 13:52:06

2

也許這:8.5.5初始值設定 C++標準 - ANSI ISO IEC 14882 2003

要零初始化類型T的對象是指: 如果T是一個標量類型(3.9),該對象設置爲0(零)轉換爲T的值;

1

根據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標準草案中也有類似的規則。