zoukankan      html  css  js  c++  java
  • 智能指针(auto_ptr和shared_ptr) 转

    http://www.cppblog.com/expter/archive/2009/03/29/78270.aspx

    都是这周看书以及代码的总结:
      
        Stl  中 auto_ptr只是众多可能的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
        这里是一个简单的代码示例,如果没有auto_ptr,

     1void ProcessAdoption(istream &data)
     2{
     3 
     4    while (data)                            // 如果还有数据
     5    {
     6        ALA   *pa = readALAData(data);      // 取出下一个数据
     7        pa->DealProcessAdoption(data);        // 处理
     8 
     9        delete pa;                          // 释放资源
    10    }

    11    return;
    12}


         如果在DealProcessAdoption有一个exception,会发生什么事情,因为ProcessAdoption不能捕获他,所以这段代码很危险,所以DealProcessAdoption后面的代码可能会跳过,造成内存泄露。
    如果利用try catch去捕获他,会搞得代码很乱,又缺少美观性。

    所以Stl提供了一个智能指针来解决这个问题,我们可以先模拟实现一个智能指针的类实现。

     1// 关于一个智能指针的定义
     2template<typename Type>
     3class auto_ptr
     4{
     5public:
     6    auto_ptr(T *=NULL) :Ptr(p)
     7    {     }
     8    ~auto_ptr()
     9    {
    10        delete Ptr;
    11    }

    12private:
    13    Type *Ptr;
    14}
    ;
    15
    16
    17void ProcessAdoption(istream &data)
    18{
    19
    20    while (data)                            // 如果还有数据
    21    {
    22        auto_ptr<ALA> pa(readALADara(data));
    23        pa->DealProcessAdoption(data);
    24    }

    25    return;
    26}


    这个版本和原先版本的差异只有二处,
    第一pa是一智能指针的对象,不是ALA*
    第二不用自己去释放delete

    然后我看到Effective STL的条款
    8:永不建立auto_ptr的容器
    关于此可以看的Effective STL的条款8

    因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

    auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char>  pstr (new char[12] ); //数组;为定义
    然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

    然后收集了关于auto_ptr的几种注意事项:
    1、auto_ptr不能共享所有权。
    2、auto_ptr不能指向数组
    3、auto_ptr不能作为容器的成员。
    4、不能通过赋值操作来初始化auto_ptr
    std::auto_ptr<int> p(new int(42));     //OK
    std::auto_ptr<int> p = new int(42);    //ERROR
    这是因为auto_ptr 的构造函数被定义为了explicit
    5、不要把auto_ptr放入容器

    然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。
    5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。

    scoped_ptr <boost/scoped_ptr.hpp> 简单的单一对象的唯一所有权。不可拷贝。
    scoped_array <boost/scoped_array.hpp> 简单的数组的唯一所有权。不可拷贝。
    shared_ptr <boost/shared_ptr.hpp> 在多个指针间共享的对象所有权。
    shared_array <boost/shared_array.hpp> 在多个指针间共享的数组所有权。
    weak_ptr <boost/weak_ptr.hpp> 一个属于 shared_ptr 的对象的无所有权的观察者。
    intrusive_ptr <boost/intrusive_ptr.hpp> 带有一个侵入式引用计数的对象的共享所有权。

    1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
    2. shared_ptr比auto_ptr更安全
    3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

    关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
    1、shared_ptr<T> p(new Y);


    要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
    要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板

  • 相关阅读:
    线程池中的scheduleAtFixedRate scheduleWithFixedDelay区别
    几道MySQL问题
    【SQL server 2012】复制数据库到另一台机器上
    LeetCode 98. 验证二叉搜索树
    深度学习知识点
    Graph Network Notes
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    剑指 Offer 29. 顺时针打印矩阵
    LeetCode 54. 螺旋矩阵
    LeetCode 50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/peer/p/2103213.html
Copyright © 2011-2022 走看看