c++中int a, int *a=new int和 int *a=new int()

首先有以下3条代码:

int a1;

int *a2=new int;

int *a3=new int();

这里分一个情况来讨论,似乎c++ 98中和c++11中情况不同,分别输出这些参数,会发现

c++11中每次输出时,均是0,因此这三条效果上等价,但是第一条是分配在栈空间中,而后面两条则是在堆空间中。

但根据网上的资料,博主并未进行尝试,在c++ 98的编译器中,这三条是不同的,每次a1会输出一个不定的固定值,a2是不同的数值,a3则是一直为0,根据资料说明,原因在于:

1)a1在栈空间中,编译器总是会分配当前为空的栈地址,而每次运行时状况几乎相同,因此一直分配同一个栈。

 2)和3)对于POD类型,C++98中new TYPE; 分配的TYPE实例的具体 indeterminate value (不确定的值)而 new TYPE(); 则执行 zero-initialize而 C++03中,new TYPE(); 执行 value-initilize,结果却还是 zero-initilize另外对于没有显示声明构造函数的非POD类型,new TYPE 与 new TYPE() 也是不一样的,后者会逐字段zero-initialize而前者不会。

特别注意最后一句,对于非内置类型,c++11中的情况为:若构造函数没有参数,则()可以省略,因此new Type和new Type()是完全一样的。

本文仅根据网上的c++98和c++11情况的不同做了一个讨论,若有问题,麻烦大家指出,谢谢。

你可能感兴趣的:(c++)