默认分配器将int清零



使用STL容器时,我不确定默认分配器分配的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()

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

注意,这与分配器没有任何关系。。。假设tbe分配器不影响内存是非常安全的,除了可能的专用调试分配器(或者被欺骗认为将内存清零可能是好事,而不是隐藏错误的设备编写的分配器)。。。并且调试分配器不会将存储器归零,而是用可识别的模式来填充存储器(例如,当以十六进制查看时产生0xdeadbeef)。

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

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

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

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

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

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

  • 如果T是一个具有用户声明构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化形式不正确);

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

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

  • 否则,对象为零初始化

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

  • 如果T是非POD类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化形式不正确);

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

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

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

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

最新更新