0.概述
- 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。
1.对概述的解释
使用new时,发生:
- 内存被分配出来
- 针对此内存有一个或更多构造函数被调用
使用delete时,发生:
- 针对此内存有一个或更多析构函数被调用
- 内存被释放
对于delete,被删除的内存中对象的数目决定了调用析构函数的数目,也就是即将被删除的指针指向的是单一对象还是对象数组,因为两者的内存布局一般是不同的,可以想象如下:
如图所示,数组内存中一般还包含数组大小的记录,以便delete知道需要调用多少次析构函数。
当对指针使用delete,加上[]相当于告诉它这个指针指向一个数组,否则它便会按照单一对象来处理。
std::string *stringPtr1 = new std::string;
std::string *stringPtr2 = new std::string[100];
...
delete stringPtr1; // delete an object
delete [] stringPtr2; // delete an array of objects
2.注意事项
2.1 多个析构函数
对于含有指向动态分配内存的指针,并且含有多个析构函数的类,必须在所有析构函数中使用相同形式的new来进行初始化。
2.2 typedef
对于typedef,
typedef std::string AddressLine[4];
AddressLines是数组,如果这样使用:
std:String *pal=new AddressLines;
就必须配上数组形式的delete:
delete [] pal;
为了避免出错,最好不要对数组形式做typedef。C++标准库中含有的string、vector等模板,可以将对数组的需求降至最低。例如可以将AddressLines定义为vector<string>