【发布时间】:2011-04-25 06:48:19
【问题描述】:
一个小时前,我发布了一个答案here,据我说是正确的。但是我的回答被Martin B 否决了。他说
你很幸运并且得到了零,因为我所在的内存恰好是零初始化的。标准不保证这一点。
但是在阅读了 Michael Burr 的回答 here 并尝试了以下示例代码之后
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
我在 MSVC++ 2010 上遇到调试错误。
当我在 MSVC++2010 上尝试以下代码 [My answer here] 时遇到类似错误
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
(1) 和 (2) 在 gcc/Clang 上都没有给出任何此类错误,这让我想到 MSVC++2010 是否不支持 C++03。我不确定。
根据 Michael Burr 的帖子 [in C++03]
new B() - 值初始化 B,它零初始化所有字段,因为它的默认 ctor 是编译器生成的,而不是用户定义的。
标准说
对 Tmeans 类型的对象进行值初始化:
——如果 T 是具有用户声明的构造函数 (12.1) 的类类型(第 9 条),则调用 T 的默认构造函数(如果没有,则初始化是非良构的可访问的默认构造函数);
.....
否则,对象被零初始化
从第一点开始,如果没有用户声明的默认构造函数,编译器合成的默认构造函数将被调用,这将zero initialize所有字段(根据最后一点)。
那么我哪里错了?我对值初始化的解释正确吗?
【问题讨论】:
-
@Charles :非常感谢这些链接。如果您发布 [您的评论] 作为答案,我会接受。
:) -
@Charles Bailey:真的,这实际上回答了这个问题。为什么这不是答案?
-
@Naveen:是的。很可能,他在 VS 中经历过这种情况并得出错误的结论。可惜这么基本的东西没有正确实现。
-
致所有人:感谢您对我的教育!
标签: c++ visual-c++ initialization value-initialization