条款
16
:成对使用
new
和
delete
时要采取相同形式
std::string*stringArray = new std::string[100];
...
delete stringArray;
使用了 new 动态申请了资源,也调用了 delete 释放了资源。但这代码存在 “ 不明确行为 ” 。 stringArray 对象中的 99 个
不太可能被适当删除,因为它们的析构函数很可能没被调用。
当我们使用new,有两件事情发生:第一,内存被分配出来;第二,针对此内存会有一个(或更多)构造函数被
调用。当你使用delete,也有两件事发生:针对此内存会有一个(或多个)析构函数被调用,然后内存才被
释放。delete的最大问题在于:即将被删除的内存之内究竟有多少对象?这个问题的答案决定了有多少个析构函数必
须被调用起来。
解决以上问题事实上很简单:如果你调用new时使用[],你必须在对应调用delete时也使用[]。如果你调用new时
没有使用[],那么也不该在对应调用delete时使用[]。
最好尽量不要对数组形式作typedefs动作。因为这样容易引起delete操作的“疑惑”(需不需要[]呢???)。
请记住:
- 如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。