默认分配器将int清零
Does the default allocator zeroize 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标准草案中也有类似的规则。
- 是否可以保证按字节的零 int 是零的表示形式?
- 在C++中通过零扩展将char强制转换为int
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- 在int阵列上尾随零
- React Native 0.40.0:指针和零之间的有序比较("NSNumber *"和"int")
- 我可以强制执行标量类型通过 int{} 初始化为零吗?
- 是否可以将领先的零存储在int中
- 在 foreach 样式循环中设置无符号 int 始终为零
- STL 容器使用的清零内存
- 为什么在C++中int数组没有初始化为零
- C++int函数.当零是有效的返回值时,我如何检测false
- 将 int 的所有字节设置为(无符号字符)0,保证表示零
- 为什么 abs(complex<int>) 总是返回零?
- int 运算符 != 和 == 与零相比
- C++字符串流>> int 返回零
- "int a = int();"一定要给我零吗?
- 为什么 std::array<int, 10> x 不是零初始化,而是 std::array<int, 10> x = std::array<int, 10>()
- c++将带前导零的Int保存为String,而不显示它们
- 默认分配器将int清零
- 如何将包含其他结构和数组的整个结构对象数组清零