zoukankan      html  css  js  c++  java
  • auto_ptr 浅析(转)

    auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)

    auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。

    std::auto_ptr<ClassA> pa(new ClassA);

    下面主要分析一下auto_ptr的几个要注意的地方:

    1,Transfer of Ownership

    auto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,在给其他auto_ptr赋值的时候,会转移这种拥有关系。

    #include <utility>
    #include <iostream>
    using namespace std;
     
    class A
    {
    public:
        A() { id = ++count; cout << "create A" << id  <<  "
    "; }
        ~A() { cout << "destroy A" << id << "
    "; }
    private:
        static int count;
        int id;
    };
     
    int A::count = 0;
     
    /*调用该函数会丢失掉所有权*/
    void sink(auto_ptr<A> a)
    {
        cout << "Enter sink()
    ";
    }
     
    /*调用该函数会创建对象,并获取所有权*/
    auto_ptr<A> create()
    {
        cout << "Enter create()
    ";
        auto_ptr<A> a(new A());
        return a;
    }
     
    int main(int argc, char *argv[])
    {
        auto_ptr<A> a1 = create();
        auto_ptr<A> a2 = a1; /*转移所有权,此时a1无效了*/
        auto_ptr<A> a3(new A());
        cout << "Exit create()
    ";
        sink(a2);/*丢失所有权,会发现a2的释放在sink函数中进行*/
        cout << "Exit sink()
    ";
        return 0;
    }
     
    输出结果是:<br>Enter create()<br>create A1<br>create A2<br>Exit create()<br>Enter sink()<br>destroy A1<br>Exit sink()<br>destroy A2<br><br>

    2,从上可知由于在赋值,参数传递的时候会转移所有权,因此不要轻易进行此类操作。

       比如:std::auto_ptr<ClassA> pa(new ClassA());

       bad_print(pa); //丢失了所有权

       pa->...; //Error

    3,使用auto_ptr作为成员变量,以避免资源泄漏。

       为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。

       比如,如果该类有2个成员变量,指向两个资源,在构造函数中申请资源A成功,但申请资源B失败,则构造函数失败,那么析构函数不会被调用,那么资源A则泄漏。

      为了解决这个问题,我们可以利用auto_ptr取代普通指针作为成员变量,这样首先调用成功的成员变量的构造函数肯定会调用其析构函数,那么就可以避免资源泄漏问题。

    4,不要误用auto_ptr

      1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。

      2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。

      3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。

      4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。

    原帖地址:http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html

  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/wainiwann/p/3612104.html
Copyright © 2011-2022 走看看