C++ 默认分配器是否将int归零?
使用STL容器时,我不确定默认分配器分配的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:
#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用于明确分配和其余分配之间的区别。