原文地址http://unixjunkie.blogspot.com/2009/05/c-new-foo-vs-new-foo.html
翻译加修订
问题是:在C++中,以下两者有何不同
- new Foo;
- new Foo();
两者都是正确的语句,它们都返回一个指针,指向新创建的Foo(存放在堆中)。但是,当Foo是POD类型时,它们的表现有所不同。
PS:POD类型是指一个类或对象,其成员是原生数值类型(int, unsigned char, float, bool等等)或者另外一个POD类型。POD对象看起来像C语言风格的结构对象,例如:
// POD class Foo { public: int a; }; // NOT a pod class Bar { public: int a; string name; // not a POD type };
当Foo是POD类型时,new Foo不会初始化,而new Foo()会将成员初始化为默认值
struct Foo { int a; }; int main() { Foo* foo = new Foo; foo->a = 7; delete foo; Foo* new_foo = new Foo; printf("new_foo->a = %d\n", new_foo->a); delete new_foo; return 0; }
a值将为不定值,编译器不同结果不同。例如在gcc下,a值将为旧值,即第一次赋值后的7。而在vc下,a值将为0xcccccccc。
struct Foo { int a; }; int main() { Foo* foo = new Foo(); foo->a = 7; delete foo; Foo* new_foo = new Foo(); printf("new_foo->a = %d\n", new_foo->a); delete new_foo; return 0; }
a值将初始化为0