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 取代即可。