当使用STL容器时,我不确定默认分配器分配的int是否已归零。下面的代码表示“是”的问题:默认分配器zeroize int吗?
#include <map>
#include <iostream>
int main() {
using namespace std;
map<int, int> m;
cout << m[1234] << endl;
}
由于没有文件证实这一点,我不敢想当然。
当使用STL容器时,我不确定默认分配器分配的int是否已归零。下面的代码表示“是”的问题:默认分配器zeroize 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
)。
+1用于区分分配和其余清零。 – 2012-03-06 13:52:06
也许这:8.5.5初始值设定 C++标准 - ANSI ISO IEC 14882 2003
要零初始化类型T的对象是指: 如果T是一个标量类型(3.9),该对象设置为0(零)转换为T的值;
根据C++ ISO标准14882:2003,似乎默认分配器模板将使用new int()
来默认初始化int为0。第8.5章,第-5,7-:
要零初始化类型T的对象是指:
- 如果T是一个标量类型(3.9),该对象被设置为0(零)转换为T的值;
要值初始化类型T的对象是指:
如果T是一个类类型(第9节)与用户声明的构造(12。1),那么调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化不合格);如果T是一个没有用户声明构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都被初始化;
如果T是一个数组类型,那么每个元素都是值初始化的;
否则,该目的是零初始化
要缺省初始化类型T的对象是指:
如果T是一个非POD类类型(第9章),调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不合格);
如果T是一个数组类型,每个元素都是默认初始化的;
否则,该对象被零初始化。
对象的初始值设定项是一组空括号,即(),应进行值初始化。
在C++ 11 ISO标准草案中也有类似的规则。
分配器将默认构造。这应该是相关的: –
RobH
2012-03-06 13:39:26
或者,从MSDN: –
RobH
2012-03-06 13:41:50
@RobH链接不起作用。 – 2012-03-06 13:42:40