zoukankan      html  css  js  c++  java
  • 资源管理

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

      

  • 相关阅读:
    Maven安装
    Linux登录欢迎图案
    GC的性能指标和内存容量配置原则
    java堆结构和垃圾回收
    框架设计知识点纵览(笔记)
    .net core在Linux本地化Localization的一次填坑
    .Net Identity OAuth 2.0 SecurityStamp 使用
    CentOS 7 安装. Net Core SDK 2.0
    Docker基本命令与使用 —— Docker容器的网络连接(四)
    Docker基本命令与使用 —— Dockerfile指令与构建(三)
  • 原文地址:https://www.cnblogs.com/yitong0768/p/4563834.html
Copyright © 2011-2022 走看看