[C++]new Foo 和 new Foo()的区别

原文地址http://unixjunkie.blogspot.com/2009/05/c-new-foo-vs-new-foo.html

翻译加修订

问题是:在C++中,以下两者有何不同

  1. new Foo;
  2. 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

posted @ 2012-06-19 12:35  斯啦丝拉  阅读(1713)  评论(0编辑  收藏  举报