Effective C++读书笔记
--By Nathan.Yu 2007-12-08--
3 资源管理(之四)
条款16:成对使用new和delete时要采取相同形式(Use the same form in corresponding uses of new and delete)
使用new时发生的事情:
1、 内存被分配(通过operator new函数)
2、 针对此内存会有一个或多个构造函数被调用。
使用delete时发生的事情:
1、 针对此内存会有一个或多个析构函数被调用。
2、 释放内存(通过operator delete函数)
delete的最大问题在于:即将被删除的内存中含多少对象?(指针所指的是单一对象还是数组?)
如果你调用new时使用[],你必须在delete时也使用[]。如果你调用new时没有使用[],那么delete时也不需[]。
最好不要对数组形式做typedefs动作。
请记住:
1、 如果你在 new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。
条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)
有函数:
proessWidget(std::tr1::shared_ptr<Widget> pw, int);
有调用:
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()); // 可能引起资源泄漏
这个调用可能引起资源泄漏!
因为C++不像Java和C#总以特定的顺序完成函数参数的核算。
因此,参数的调用过程可能是这样的:
1) new Widget()
2) priority() ; //如果这里产生异常,则1)new的资源就会泄漏了
3) shared_ptr的构造函数
但可以确定1)总在3)之前。
避免这类问题的方法:
std::tr1::shared_ptr<Widget> pw(new Widget);// 以独立语句将newed对象置入智能指针
processWidget(pw, priority()); // 绝不会引起资源泄漏
请记住:
以独立语句将newed对象存储于智能指针。如果不这样做,一旦异常被抛出,有可能导致难以察觉到资源泄漏。