使用 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()
.
该标准保证使用下标运算符创建的对象是默认构造的。任何特定类的默认构造函数是否将您希望归零的成员归零取决于该类。对于没有构造函数的类,成员是默认构造的,默认构造基本类型相当于将其设置为“零”版本。
注意,这与分配器无关!...并且假设分配器保持内存不变是非常安全的,除非可能是专用的调试分配器(或者由人们编写的分配器被欺骗认为将内存归零可能是好事而不是隐藏错误的设备)。...并且调试分配器不会将内存归零,而是用可识别的模式填充它(例如,0xdeadbeef
以十六进制查看时会导致)。
也许是这样:8.5.5 Initializers C++ Standard - ANSI ISO IEC 14882 2003
对 T 类型的对象进行零初始化意味着:如果 T 是标量类型(3.9),则将对象设置为转换为 T 的值 0(零);
new int()
根据 C++ ISO 标准 14882:2003,默认分配器模板似乎将用于默认初始化 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 标准草案中也有类似的规则。