c++ 的new 数组操作

来源:互联网 发布:chrome比价 知乎 编辑:程序博客网 时间:2024/05/02 04:53

今天群里一个朋友问到:

有class A,

1. A* pa = new A[3]  

2. pa[0] = A();

3. pa[1] = A();

4. pa[2] = A(); 

5. delete []pa;

 

构造函数和析构函数是怎么调用的? 

 

在1里,new A[3] 首先会分配内存,然后调用A的默认构造函数来初始化这个数组。所以

在这里A的构造函数被调用了3次。记住,这里只能调用A的默认构造函数。如果A没有默认构造

函数,那么会有编译错误。 什么叫默认构造函数?就是参数列表为Void的构造函数。

 

在2-4语句里,产生了三个匿名的临时变量。c++中匿名的临时变量的作用域是该临时变量坐在的表达式。

所以这里会有三个构造函数和三个析构函数

 

在5里,delete[] 会触发每个数组成员的析构函数,并释放这段内存。所以数组里的每个元素的析构函数

都被调用了一次。

 

所以大家注意的是, 如果你要删除一个用new分配的数组里的一个成员时,记得要手动调用该对象的

析构函数。这是我在STL的源代码看到的为数不多的需要程序员自己来调用析构函数的例子。

 

绝大部分情况下,析构函数都是编译器在编译的时候为你插入的(以及你使用delete的时候delete所调用的)。你完全不需要手动来call一个析构函数。

 

 

原创粉丝点击