条款16:成对使用 new 和delete时要采用相同形式

1、使用new和delete时有哪些形式?

new和delete分别有两种形式:

(1)对象数组:
type*x = new array[];
delete [] array;
(2)单一对象:
type*x = new singleObject;
delete singleObject;

2、使用new和delete分别做了什么?

(1)使用new时,有两件事发生:
  • 内存被分配出来(通过 aperator new( )函数。)
  • 指针此内存会有一个(或多个)构造函数被调用。
(2)使用delete时,有两件事会发生:
  • 有一个(或多个)析构函数被调用。
  • 内存被释放。(通过operator delete( ) 函数。)

3、new 单一对象、数组对象的区别是有哪些?

二者的内存布局不同,数组对象中多了一个记录对象个数的变量。new时 ,加上[],便意味着这是一个对象数组,因此该对象数组中会多出一个记录对象个数的变量。
delete也是同样的

4、错误的使用不匹配的new、delete可能导致的问题?

(1)对new的单一对象使用: delete[] single_object;

导致较少的析构函数被调用,内存没有完全被释放,导致内存泄露。

(2)或者对对象数组使用:delete array;

会把它的前一段内存当做记录对象数组中大小的成员变量,导致不确定行为。

注意: 在自定义的含有指向动态内存的指针时,要确保多个构造函数的每一个构造函数使用统一形式的new,这样才能确保析构函数与统一的new形式匹配。

5、new与typedef的注意事项

如果将一个数组进行typedef,那么在进行new 的时候,new 的实际上就是一个对象数组,因此delete时,也应该delete对象数组。

如下例:

typedef std::string AddressLines[4]; // 每个人的地址有4 行,每行是一个string  
//AddressLines 是一个数组。
std: :string *pal = new AddressLines; // 注意, "new AddressLines" 返回一个string *,就像"new string[4]" 一样。 

delete pal;   // 行为未有定义!  
delete [] pal;// 很好!  

为了避免上述情况(delete pal; )发生,最好不要typedef数组。这也和容易实现,使用string、vector 的template 取代即可。

原文地址:https://www.cnblogs.com/lasnitch/p/12764180.html