zoukankan      html  css  js  c++  java
  • 条款十四 在资源管理类中小心copying行为

    1.auto_ptr和shared_ptr只是适合用于管理heap(堆)上的内存,即动态分配的内存,但不是所有的资源都在heap上
    所有这两个智能指针并不适合用于资源管理,所有需要建立自己的资源管理类

    2.lock和unlock管理互斥对象Mutex的指针
    void lock(Mutex *pm)
    void unlock(Mutex *pm)
    希望在构造函数时调用lock(),在析构时调用unlock(),所有构建一个类

    class MagMutex
    {
    public:
      MagMutex(Mutex *pm):pClassM(pm)
      {
        lock(pClassM);
      } 
    
      ~MagMutex(Mutex *pm)
      {
        unlock(pClassM);
      }
    private:
      Mutex *pClassM;
    };

    这样的一个初始化时分配资源的类,对于对象使用拷贝函数时无法预定会发生什么情况
    MagMutex m1(&pm);
    MagMutex m2(m1); //不知道会发生什么情况

    可以使用2种方法解决
    (1) 禁止复制:将拷贝函数定义为private类型
    (2) 使用"引用计数法":如tr1::shared_ptr

    3.能否使用tr1::shared_ptr ?
    如果把 Mutex * 改为shared_ptr<Mutex>,但是shared_ptr在引用次数为0时删除其所指的事物,而我们需要的是释放所指的事物(调用unlock())
    还好,shared_ptr提供了删除器(auto_ptr没有),使用第二参数,是一个函数或者一个对象,当计数为0时被调用

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/bizhu/p/2625895.html
Copyright © 2011-2022 走看看