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

请牢记:数组

若是在new表达式中使用[],必须在相应的delete表达式中也使用[]。 new[]  对应  delete[]函数

如歌在new表达式中不适用[],必定不要在相应的delete表达式中使用[]。 new 对应 delete布局

 

当使用new时(即经过new动态生成一个对象,有两件事发生:第一,内存被分配出来(经过名为operator new 的函数);第二,针对此内存会有一个(或更多)构造函数被调用。spa

当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,而后内存才被释放(经过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存以内有究竟存有多少对象?(即将被删除的那个指针,所指的是单一对象或对象数组?)此问题的答案决定了又多少个析构函数必须被调用起来。指针

单一对象的内存布局不一样于对象数组的内存布局:数组所用的内存包括“数组大小”记录,以便delete制定须要调用多少次析构函数。单一对象的内存则没有这笔记录。对象

delete[]认定指针指向一个数组,屡次调用析构函数。所以切记 new和delete时要采起相同形式。blog

std::string* strPtr1 = new std::string;      
std::string* strPtr2 = new std::string[100]; 
...
delete strPtr1;     //删除一个对象          
delete [] strPtr2;   //删除一个由对象组成的数组

若是对strPtr1使用delete[]形式:delete会读取若干内存并解释为“数组大小”,而后屡次调用析构函数。内存

若是对strPtr2没使用delete[]形式:可能致使99个析构函数没被调用,对象不太可能被适当删除。string

也就是说,以上的两种状况均可能会致使不肯定的行为哟~class

对于typedef动做,当以new建立该种typedef类型对象时,应该说清楚应该以哪种delete形式删除。

考虑下面这个例子:

typedef std::string AddressLines[4];//每一个人的地址有4行 每行是一个string

//AddressLines是个数组,若是这样使用new:
std::string* pal = new AddressLines;//返回一个string* 跟new string[4]同样

那就必须匹配“数组形式”的delete[]:

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

为避免诸如此类的错误,最好尽可能不要对数组形式作typedef动做。取而代之可使用vector<string>等templates。

相关文章
相关标签/搜索