zoukankan      html  css  js  c++  java
  • 条款十三 以对象管理资源

    1.管理动态分配内存

    void TestFun()
    {
      int *pval = new int(0);
      .... //此处省略一万代码...
      delete pval;
      pval = NULL; //这一边最好有,不然pval相当于执行一块被释放内存的空间,也就是野指针
    }

      这里涉及到动态分配内存使用后回收问题,虽然上面函数中使用到delete,但不一定能被执行到,
    在代码"...."中如果有分支(if,while, switch)中有return或者中途抛出异常,函数都会中断,
    delete不会被执行,这就容易造成内存泄露,如果解决这个问题,可以使用"智能指针".

    2.智能指针auto_ptr对资源管理

    void TestFun()
    {
      auto_ptr<int> pval(new int); //智能指针指向一块int类型数据内存
      .... //此处省略一万代码...
    
    }

      这样就不需要管pval什么时候被释放,当不使用的时候,智能指针会自动调用自身的析构函数释放对象,
    不要多个智能指针指向同一个对象,这可能导致一个对象被多次释放,所以当使用auto_ptr的复制构造或者
    赋值操作符函数时,自身要释放对对象的所以控制权,转交给新的智能指针

    void fun()
    {
      int *i = new int(0);
      auto_ptr<int> ptr_1(i);
      auto_ptr<int> ptr_2 = ptr_1; //可以auto_ptr<int> ptr_2(ptr_1) ,ptr_1交出对指针i的控制权给ptr_2;
      //这样后不能再使用ptr_1,因为它已经失去对变量 i的控制
    }

    auto_ptr不能用于数组指针,因为auto_ptr调用是delete,而不是delete[],也不能用于STL

    3.引用计数型智能指针shared_ptr
    通过跟踪对象,记录对象的引用次数,当次数为0时才释放内存,与auto_ptr不同的是,shared_ptr可以进行多次复制行为
    并且原来的指针不交出对对象控制的权限

    int *i = new int(0);
    std::tr1::shared_ptr<int> p1(i);
    std::tr1::shared_ptr<int> p2(p1); //p1还可以使用
    std::tr1::shared_ptr<int> p3 = p2; //p2还可以使用


    4.这节重点不是auto_ptr和shared_ptr,而是用这两个资源管理类创建一个对象对动态分配的资源管理,实现自动释放资源,
    避免忘记释放动态分配的内存而造成内存泄露

  • 相关阅读:
    在使用IO流时该选择何种流对象
    对Java中的File类的一些理解
    AlarmManager实现闹钟功能
    Android 中 Movie 类显示GIF图片
    Java对象序列化和serialVersionUID [转载]
    Git常用命令行操作
    Android中常用的编码和解码(加密和解密)的问题
    Android apk反编译 和 防止反编译
    Bitmap 图片二次采样 【转载】
    Android:瀑布流效果 的简单实现
  • 原文地址:https://www.cnblogs.com/bizhu/p/2615274.html
Copyright © 2011-2022 走看看