默认分配器是否归零int?

时间:2012-03-06 13:30:56

标签: c++ stl allocator

使用STL容器时,我不确定默认分配器分配的int是否已归零。以下代码表示问题的“是”:

#include <map>
#include <iostream>

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

由于没有文件证实这一点,我不敢把它视为理所当然。

4 个答案:

答案 0 :(得分:6)

你会看到,在std::map::operator[]的实现中,如果在索引处找不到该元素,则插入并返回一个新元素:

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

其中mapped_type是第二种类型,在您的情况下为int。所以是的,它默认初始化为0,因为它被插入为mapped_type()

答案 1 :(得分:6)

该标准保证由于使用下标运算符而创建的对象是默认构造的。任何特定类的默认构造函数是否将您希望归零的成员归零都取决于类。对于没有构造函数的类,默认构造成员,默认构造基本类型相当于将其设置为“零”版本。

注意,这与分配器有! ...并且可以非常安全地假设分配器保持内存不变,除了可能专用的调试分配器(或由人们写入的分配器,认为将内存归零可能是好事而不是设备隐藏错误)。 ...并且调试分配器不会将内存归零,而是用可识别的模式填充它(例如,当以十六进制查看时会导致0xdeadbeef。)

答案 2 :(得分:2)

也许这样: 8.5.5初始化程序 C ++标准 - ANSI ISO IEC 14882 2003

对T类型的对象进行零初始化意味着: 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;

答案 3 :(得分:1)

根据C ++ ISO标准14882:2003,似乎默认的分配器模板将使用new int()默认初始化int为0。第8.5章,第5,7条:

  

零初始化 T类型的对象意味着:

     
      
  • 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;
  •   
     

值初始化,T类型的对象意味着:

     
      
  • 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

  •   
  • 如果T是没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;

  •   
  • 如果T是数组类型,则每个元素都是值初始化的;

  •   
  • 否则,该对象为零初始化

  •   
     

默认初始化,T类型的对象意味着:

     
      
  • 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误);

  •   
  • 如果T是数组类型,则每个元素都是默认初始化的;

  •   
  • 否则,该对象为零初始化。

  •   
     

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。

C ++ 11 ISO标准草案中也有类似的规则。