【发布时间】:2011-11-24 16:29:30
【问题描述】:
有这样的代码:
#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 5
wsk2: 0x928e008 0
我读到new 不会用零初始化内存。但在这里似乎确实如此。它是如何工作的?
【问题讨论】:
-
它没有,你必须使用新的 unsigned int()。读取未初始化的变量是UB,0肯定是可以的。
-
顺便说一句,实际上很多内存无论如何都是零。如果你对一大块内存进行简单的 malloc,它通常在某些系统上全为零,或者在其他系统上大多为零。
-
@NicholasWilson:对于大多数系统,只有当内存直接来自操作系统时(出于安全原因),这才是正确的。当它来自分配器缓存的内存时,它很可能包含它在 free()d 之前所做的任何事情。这也是为什么此类错误有时不会出现在测试用例/单元测试中的原因,而只是在“真实”程序运行一段时间后出现。 Valgrind 在这里进行救援。
-
是的。这就是我的观点。如果您创建一个新变量并看到它为零,您不能立即假设您的程序中的某些东西已将其设置为零。由于大多数内存都准备好归零,因此它可能仍未初始化。我认为我的评论实际上比下面的大多数答案更接近于回答这个问题,因为提问者想知道为什么未初始化的内存可能为零。
-
尝试分配一个数组,将所有项目设置为某个非零值,然后将其删除 [] 并再次分配它 - 只有第一个项目将被归零 - 其他项目保留它们的值 - 我认为这是一个特殊性内存分配器(在 Linux 下测试)。
标签: c++ memory-management