从C背景来看,我一直认为POD类型(例如ints)从来不会在C++中自动初始化,但似乎这显然是错误的!C++ POD类型何时获得零初始化?
我的理解是,只有'裸'的非静态POD值不会被零填充,如代码片段所示。我说得没错,还有其他重要的案例我错过了吗?
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是使用该物理内存页面的最后一个进程,那么可能存在登录信息或私钥。 – 2010-06-23 13:45:27
操作系统在分配内存时要保持内存清零似乎有点浪费。 – Alan 2010-06-23 13:46:41
您可能还会阅读Michael Burr在回复[[类型名称与新的区别之后的括号是否相同]]的优秀相关文章(http://stackoverflow.com/questions/620137/do-the-parentheses-在类型名称make-a-difference-with-new/620402#620402) – 2010-06-23 13:46:43