资源管理

条款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对象置入只能指针

  

原文地址:https://www.cnblogs.com/yitong0768/p/4563834.html