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

当你使用new,有两件事情发生。

第一,内存被分配出来(通过名为operator new的函数)。

第二,针对此内存会有一个(或多个)构造函数被调用。当你使用delete,也有两件事情发生:针对此内存会有一个或多个析构函数被调用,然后内存被释放。

数组所用的内存通常还包括”数组大小”的记录,以便delete知道调用多少次析构函数。

当你调用new时使用[],你必须在对应调用delete时也使用[]。如果你在调用new时没使用[],那么也不该在对应调用delete时使用[]。

当你撰写的class含有一个指针指向的动态内存分配,并提供多个构造函数时,你必须小心的在所有构造函数中使用相同形式的

new将指针成员初始化。否则,不知道该在析构函数中使用什么形式的delete。因为析构函数只有一个。

这个规则对于稀罕使用typedef的人也很重要:

typedef std::string AddressLines[4];

由于AddressLines是个数组,如果这样使用new:

std::string* pal = new AddressLines; //注意,“new AddressLines”返回一个string*,就像“new string[4]”一样

那必须匹配数组形式的delete:

delete pal; //行为未定义

delete [] pal; //很好。

为避免此类错误,最好不要对数组形式做typedef动作,真很容易达成,因为C++标准库含有string,vector等templates,可将数组的需求降至几乎为0。可将本例的AddressLines定义为vector<string>。

原文地址:https://www.cnblogs.com/lidan/p/2322962.html