C++ 默认分配器是否将int归零?

C++ 默认分配器是否将int归零?,c++,stl,allocator,C++,Stl,Allocator,使用STL容器时,我不确定默认分配器分配的int是否已归零。以下代码表示问题为“是”: #include <map> #include <iostream> int main() { using namespace std; map<int, int> m; cout << m[1234] << endl; } #包括 #包括 int main(){ 使用名称空间std; 地图m; cout您将看到,在std::map:

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

#include <map>
#include <iostream>

int main() {
  using namespace std;
  map<int, int> m;
  cout << m[1234] << endl;
}
#包括
#包括
int main(){
使用名称空间std;
地图m;

cout您将看到,在
std::map::operator[]
的实现中,如果在索引中找不到元素,将插入并返回一个新元素:

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

其中,
mapped_type
是第二种类型,在您的例子中是
int
。因此是的,它默认初始化为
0
,因为它作为
mapped_type()插入

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


注意,这与分配器没有任何关系!…并且可以很安全地假设,分配器保持内存不变,除了可能的专用调试分配器(或被欺骗认为将内存归零可能是件好事而不是隐藏bug的设备编写的分配器)..调试分配器不会将内存归零,而是用可识别的模式填充内存(例如,当以十六进制查看时,会导致
0xdeadbeef

可能是这样:8.5.5初始值设定项 C++标准ANSI ISO IEC 14882 2003</P> 将T类型的对象初始化为零意味着:
如果T是标量类型(3.9),则对象被设置为0(0)的值,转换为t;

< p>看起来默认的分配器模板将使用<代码>新int()/Cux>默认初始化INT为0,根据C++ ISO标准1488∶2003。第8.5章,CaluSe 5,7:< /P> 将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标准草案中也有类似的规则。

分配器将默认构造。这应该是相关的:或者,从MSDN:<>正确的术语是“默认初始化”;例如,
map
将字符串默认为
@RobH:在STL容器中,“分配器”通常指
std::allocator
或其替代品。@LuchianGrigore现在应该可以工作了。我知道将插入一个int,但我不确定它是否为零。我不确定
new int
是否会返回一个指向0的指针。@peter它不是
new int
,而是
int()
,它将产生
0
@peter:这是另一个问题(不;使用
new int()
std::map
不分配单个
int
对象,但每个节点都拥有
实际上
new int
必然会产生指向不可预测值的指针;
new int()
将产生一个指向零的指针,因为
int()
是一个初始化为零的
int
。+1用于明确分配和其余分配之间的区别。