当你使用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>。