[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-10
Item16基本可以一语带过,因为讲得本来就很简单:
-
用new分配一个内存对象时,语法格式是new a;
用delete释放一个内存对象时,语法格式是delete a;
-
用new分配一组内存对象时,语法格式是new a [num_of_elem];
用delete释放一组内存对象时,语法格式是delete [] a;
不要错用了就可以。原因呢,也很简单:
new或是delete包含了两个阶段:
-
new:申请并分配内存空间;调用构造函数构造即将使用空间的对象
-
delete:调用析构函数析构使用空间的对象;释放内存
分配内存给一组对象的时候,编译器一般会在这一片内存前端(或是其他什么地方)插入一小段信息,用来标明这片内存是给多少个对象的,然后反复调用构造函数来创建这一组对象。当用delete []的时候,释放内存的操作就会以该信息为依据,反复调用对象的析构函数对这组对象进行释放。(下面的[n]就是这段信息)
[n][MEM]
而如果只是分配内存给一个对象,这段信息就不存在了。直接在这片内存上应用析构函数。
于是用delete []去释放new的内存,或是用delete去释放new []的内存,都会造成不可预计的后果。