条款13:以对象管理资源
平常我们的写法可能是这样的:
void function() { Object* object = new Object(); //new一个object对象 ... delete object; //释放o所指向的对象 }
但是这并不是绝对安全的做法,因为在“...”过程中可能过早的return或者抛出异常使得object所指向的对象无法被释放。
我们需要把资源放到对象里,依赖C++的析构函数自动调用机制,确保资源被释放。这就是 智能指针 的思想。
条款14:在资源管理类中小心copying行为
上面提到的智能指针可以管理heap-based的资源,但不是所有资源都是heap-based的,所有有时我们需要建立自己的资源管理类。例如对于Mutex的互斥对象,有lock和unlock两个函数可以用:
void lock(Mutex* pm) //锁定pm指向的互斥器 void unlock(Mutex* pm) //解锁pm指向的互斥器
根据上一条规则,我们可以定义一个对象来管理这个资源:
class Lock { public: explicit Lock (Mutex* pm) : mutexPtr(pm) { lock (mutexPtr); } ~Lock() { unlock (mutexPtr); } private: Mutex mutexPtr; };
这样可以自动解除锁定的效果,但是我们需要面临一个问题:Lock对象被复制的时候应该发生什么?一般有两种做法:
- 禁止复制,在条款06中讲过如何做到禁止复制
- 用“引用计数法”管理资源,可以达到保有资源直到最后一个使用者被销毁
条款15:在资源管理类中提供对原始资源的访问
条款16:成对使用new和delete时要采用相同的形式
这个条框其实很简单,如果new时使用[],即new了对象数组,则delete的时候也需要带[],才能正确的释放空间。
条款17:以独立语句将newed对象置入只能指针