一. 内容
- 当你使用 new 动态生成对象时,有两件事发生:
- 通过名为
operator new()
函数,分配内存 - 针对此内存
调用一个或多个构造函数
当你使用 delete 删除分配内存时,上述事情以相反的方式同样发生。
- 通过名为
- 但 delete 存在一个问题:
我怎么知道有多少对象要被删除
。更简单些,我怎么知道即将被删除的指针是指向单一对象还是数组。这个问题很重要,因为单一对象的内存布局一般而言不同于数组
,数组所用内存还包括数组大小的记录
,以便 delete 知道需要调用多少次析构函数
。 - 而让 delete 知道待删除的指针是否是数组的唯一方法是:由你来告诉它,即使用
[ ] delete
。 - 对于
单一对象不要使用 [ ] delete ,对于数组对象不要使用 delete
,两者都会引发未定义行为使得程序走向漫长的调试过程。也就是说 new 和 delete 的形式要保持一致。 - 对于使用
typedef
的程序员,务必清楚其类型,避免使用出错。而且一般没必要对数组进行 typedefs,因为C++标准库中的 vector,string 等 templates,足以代替数组。
二. 总结
- 如果你在new表达式中使用[ ],必须在相应的delete表达式中也使用[ ]。如果你在new表达式中不使用[ ],一定不要在相应的delete表达式中使用[ ]。