2012-03-06 51 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标准草案中也有类似的规则。