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时被调用

  • 相关阅读:
    Linux学习
    PHP语法笔记
    iOS二次发育(swift)闭包
    iOS二次发育(swift)类
    iOS二次发育(swift)结构体
    iOS二次发育(swift)枚举
    【NOIP2013模拟联考14】隐藏指令
    【NOIP2012模拟8.9】逐个击破
    NOIP2020.9.19模拟patrick
    NOIP2020.9.19模拟 spongebob
  • 原文地址:https://www.cnblogs.com/bizhu/p/2625895.html
Copyright © 2011-2022 走看看