Effective C++ 炒冷饭 - Item 16 怎么New的怎么Delete

Effective C++ 炒冷饭 - Item 16 怎么New的怎么Delete
[原创文章欢迎转载,但请保留作者信息]
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 []的内存,都会造成不可预计的后果。

你可能感兴趣的:(Effective C++ 炒冷饭 - Item 16 怎么New的怎么Delete)