问题不在于堆分配,而在于您在分配时使用的括号。如果您这样做:
A* a = new A;
加括号后代码能正常运行的原因是,这样你的结构体就被值初始化了,对于POD类型(例如 A
)来说,值初始化会初始化每个成员变量,而int
的默认值初始化为零。
这意味着如果你在堆栈上创建变量时只需添加值初始化括号,它也可能会正常工作:
it would also fail.
A a = A(); // watch out for the http://en.wikipedia.org/wiki/Most_vexing_parse
尽管这会带来其他潜在问题,但如果可以的话最好使用统一初始化(需要C++11):
A a{};
A a = A();
可以工作,但 A a{};
真的可以工作吗? - juanchopanza()
,那么对于 POD 类型,它只会进行成员初始化而不是调用构造函数? - borisbn根据上述定义,即使默认构造函数被删除,它仍然是平凡的,因此实际上不会被调用。这被认为是标准中的一个缺陷,并且相关语言已经由CWG issue 1301进行了修改。
编译器供应商通常会实现缺陷解决方案,因此这可以被认为是GCC 4.8中已经修复的错误。