运算符new将内存初始化为零有这样的代码:#include <iostream>int main(){ unsigned int* wsk2 = new unsigned int(5); std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; delete wsk2; wsk2 = new unsigned int; std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl; return 0;}结果:wsk2: 0x928e008 5wsk2: 0x928e008 0我读过new没有用零初始化内存。但似乎它确实如此。它是如何工作的?
3 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
operator new
不保证将内存初始化为任何内容,并且在没有new-initializer的情况下分配a 的new-expression会使对象具有不确定的值。unsigned int
读取未初始化对象的值会导致未定义的行为。未定义的行为包括评估零值而没有不良影响但可能导致任何事情发生,因此您应该避免导致它。
在C ++ 11中,使用的语言是分配的对象是默认初始化的,对于非类类型意味着不执行初始化。这与C ++ 03 中default-initialized的含义不同。
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
对于一些编译器,new的调试版本将初始化数据,但肯定没有什么可以依赖。
存储器也可能从之前的使用中获得0。不要假设删除和新内存之间没有任何内容发生。在背景中可能会有一些你从未注意到的事情。此外,相同的指针值可能不是相同的物理内存。内存页面被移动并被分页输入。指针可能被映射到一个完全不同的位置。
底线:如果您没有专门初始化内存位置,那么您可以不假设其内容。在使用内存之前,内存管理器甚至可能不会分配特定的物理内存位置。
现代内存管理非常复杂,但作为一名C ++程序员,你并不在乎(主要是‡)。遵守规则,你不会遇到麻烦。
‡如果您正在优化以减少页面错误,您可能会在意。
- 3 回答
- 0 关注
- 924 浏览
添加回答
举报
0/150
提交
取消