• 资源管理


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

      

  • 相关阅读:
    面试
    无中生有
    数字称王-0-10000,
    数组排序
    uiview 阴影
    TTTAtibutedlabel again
    vim配置python编程环境及YouCompleteMe的安装教程
    centos7下vim8.1的编译安装教程
    centos7下误执行chmod -R 777 /后的权限修复方法
    如何用浏览器在线查看.ipynb文件
  • 原文地址:https://www.cnblogs.com/yitong0768/p/4563834.html
Copyright © 2020-2023  润新知