C++中new A(),new A与new A[]的区别

 

在C++中经常需要用到new来进行动态内存的分配,但是在使用new的过程中对于新手容易产生混淆,特别是关于形如new A(),new A[],new A,三者的区别。实际上他们分别表示对一个对象分配内存并初始化,直接为一个对象进行内存分配,对一个对象分配一组内存,但这只是一个简单的概述,今天我们就来更详细地了解这个问题。

1.new A

例如:int *p=new int;

是一个最简单的new A的表达式,它表示的意思是分配一个int字节的内存空间,并将其地址传给指针p。但是仅仅分配了一个int字节的内存,并未对内存中的内容进行初始化,其中的内容是未定义的。

例如:string *p=new string;

这是对指针p分配一个string对象的内存,虽然同样未进行初始化,但是对于string类而言,还是会调用默认构造函数,初始化成为一个空的string对象。

2.new A()

例如:int *p=new int();或int *p=new int(123);

形如上面两个例子的new A(),同样表示的是为指针p分配一个int的内存,但后面的()表示的意思是用()中的内容对指针*p中的内容进行初始化。对于int *p=new int();而言你,缺省难过了初始化的内容则默认初始化为0,此时*p=0;对于int *p=new int(123);使用123初始化该内存区域,此时*p=123;对于string类也是同样的效果,甚至对于有时初始化成员比较多的时候还会采用”{}”运算符代替()进行初始化。

3.new A[]

例如:int *p=new int[n];

这是对指针p分配一个长度为n的int型数组的意思,指针p指向数组首元素的地址。但是虽然这里所谓的数组实际上并不是一个真正意义上的数组,而是更像单纯的一块连续的内存。因为我们不能够通过下标去随机访问这片内存中的内容,只能够通过指针自增的方式对整片内存分配的区域进行访问。所以不要奢望能够通过new A[n][m]来分配一个二维数组,这种表达式是非法的,因为实际上new只能够返回一片内存的首地址。另外对于n的取值不同于数组,它的取值可以是一个变量,在运行时在进行赋值也可以。同时n还可以是0,即int *p=new int[0];这样定义是合法的,但此时p为一个空指针。

总之,这里简要的叙述了关于new的一些区别和一些小tips,主要为自己的学习加深印象,需要更详细的了解new请参考<<C++primer>>上的内容。

猜你喜欢

转载自blog.csdn.net/qq_23557345/article/details/81742006
new