【发布时间】:2010-06-23 13:36:07
【问题描述】:
来自 C 背景,我一直认为 POD 类型(例如 int)在 C++ 中从未自动零初始化,但似乎这是完全错误的!
我的理解是,只有“裸”的非静态 POD 值不会被零填充,如代码 sn-p 所示。我是否做对了,是否还有其他重要的案例我遗漏了?
static int a;
struct Foo { int a;};
void test()
{
int b;
Foo f;
int *c = new(int);
std::vector<int> d(1);
// At this point...
// a is zero
// f.a is zero
// *c is zero
// d[0] is zero
// ... BUT ... b is undefined
}
【问题讨论】:
-
你确定它是 C++ 而不是你的操作系统吗?我想(但尚未检查)当操作系统为您的进程分配内存时,它会将其归零,至少在您触摸内存页面时。 C 和 C++ 都不需要这种行为,但如果操作系统将最后一个进程放入其中的内存页交给你,那将是一个很大的安全漏洞。如果 ssh 是使用该物理内存页面的最后一个进程,那么其中可能有登录信息或私钥。
-
操作系统在分配内存时一直将其清零似乎有点浪费。
-
您还可以阅读 Michael Burr 回复Do the parentheses after the type name make a difference with new?的优秀相关帖子
-
您是在运行调试版本还是发布版本?哪个平台?哪个编译器?
-
那个帖子太棒了......谢谢詹姆斯
标签: c++ constructor initialization