C++ auto_ptr

原创 2016年08月29日 13:45:29
        std::auto_ptr属于STL库,但是在C++11中已经被废除掉了,至于为什么被费除掉,我们稍后再看。
        std::auto_ptr的作用是控制一个对象的生命周期,内部持有对象的所有权,保存着对象的指针。它的实现非常简单,内部仅仅维护一个对象指针(the wrapped object pointer),在构造函数中构造封装的对象,在析构函数中释放。
        std::auto_ptr的构造函数声明为:
        explicit auto_ptr (X* p=0) throw();
        auto_ptr (auto_ptr* a) throw();
        template<class Y>
        auto_ptr (auto_ptr<Y>& a) throw();
        auto_ptr (auto_ptr_ref<X> r) throw();

    
        普通的构造函数会持有封装对象,拷贝构造函数会交换封装对象的所有权:
</pre><pre name="code" class="cpp">        explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
        : _Myptr(_Ptr)
        {    // construct from object pointer
        }
        auto_ptr(_Myt& _Right) _THROW0()
        : _Myptr(_Right.release())
        {    // construct by assuming pointer from _Right auto_ptr
        }



        析构函数直接释放所持对象:
        ~auto_ptr() _NOEXCEPT
        {    // destroy the object
        delete _Myptr;
        }


        std::auto_ptr 的成员函数非常简单,我们常用的就是get函数,就是获取封装对象的指针。另外还有release和reset。release函数让auto_ptr放弃所有权,reset函数释放原持有对象,重新赋予新的封装对象。具体实现如下:
        _Ty *get() const _THROW0()
        {    // return wrapped pointer
        return (_Myptr);
        }

        _Ty *release() _THROW0()
        {    // return wrapped pointer and give up ownership
        _Ty *_Tmp = _Myptr;
        _Myptr = 0;
        return (_Tmp);
        }

        void reset(_Ty *_Ptr = 0)
        {    // destroy designated object and store new pointer
        if (_Ptr != _Myptr)
            delete _Myptr;
        _Myptr = _Ptr;
        }


        另外std::auto_ptr重载的一些操作符。除了*操作符实现了指针的类似功能外,我们需要注意的是=操作符。=操作符会交换所有权,并进行一些其它必要操作,比如释放原来auto_ptr持有的所有权,释放现在auto_ptr持有的对象,现在的auto_ptr持有新的对象的所有权,具体实现如下:
        _Myt& operator=(_Myt& _Right) _THROW0()
        {    // assign compatible _Right (assume pointer)
        reset(_Right.release());
        return (*this);
        }


        我们仔细想一下就会发下这样一种情况:
        int* p = new int();
        std::auto_ptr p1(p);
        std::auto_ptr p2(p);

        这种情况就产生了两个auto_ptr拥有同一个对象的所有权,那么在释放的时候就会产生两次析构的情况,所以就会有“防止两个auto_ptr拥有一个对象”的建议。但是这个问题在std::unique_ptr中也同样可以出现,所以就需要靠使用者自己注意了吧。
        std::auto_ptr的最主要的问题在于所有权的转移问题。无论是在拷贝构造函数中还是在赋值运算符中,所有权都会进行转移。std::auto_ptr的本意我猜是为了表述所有权是唯一一个管理者持有的,所以赋值复制操作都会转移所有权,保持唯一一个管理者,这样做有很大的好处,也符合智能指针的使用策略,但是这种功能会造成过于简单地改变所有权,在很多操作上会造成莫名其妙的情况,比如在std::vector<T>中push_back后,莫名其妙地失去所有权了,这和平时的编程情况不一样,造成了一种"特别"的结果,很容易在使用上造成理解上的bug,导致意想不到的结果。这也可能是C++11废除std::auto_ptr而用std::unique_ptr代替它的原因吧。


相关文章推荐

以对象管理资源——C++智能指针auto_ptr简介

auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象。auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时,...
  • lihao21
  • lihao21
  • 2013年09月01日 21:05
  • 1301

C++垃圾回收器的实现(附auto_ptr 与CComPtr区别)

一、简介 这是一个自己写C++垃圾自动回收器,用到的都是标准C++语法。采用了引用计数加mark-sweep的方法。在没有循环引用的情况下,引用计数可以保证垃圾实时得到回收;对于有循环引用的情况下,...
  • weiqubo
  • weiqubo
  • 2011年11月08日 18:27
  • 2412

剖析C++标准库智能指针(std::auto_ptr)

剖析C++标准库智能指针(std::auto_ptr) 1.Do you Smart Pointer?       Smart Pointer,中文名:智能指针, 舶来品?     ...

C++ auto_ptr智能指针的用法

C++ auto_ptr智能指针的用法   C++中指针申请和释放内存通常采用的方式是new和delete。然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内...

C++智能指针(auto_ptr)详解 (转载)

智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限。本文总结的8个问题...
  • xamhaha
  • xamhaha
  • 2017年04月23日 20:34
  • 106

c++ 模板学习笔记:类模板模拟auto_ptr智能指针(权哥)

之前转载了一篇文章:auto_ptr详解>> 地址:http://blog.csdn.net/shawvichan/article/details/16959475 为了帮助理解其工作原理,此处自...

C/C++——跟我重写智能指针auto_ptr模版类

C/C++——跟我重写智能指针auto_ptr模版类

[C++标准模板库:自修教程与参考手册]关于auto_ptr

什么是auto_ptr指针auto_ptr是这样一种指针:它是“它所指的对象”的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要求一个对象只能拥有一个...

《C++标准程序库》读书笔记 2012-07-08 auto_ptr 作为参数传递

《C++标准程序库》中说明auto_ptr当需要作为参数传递时,安全的方式是使用const T&方式 分析如下: 对于使用by value方式传递,不管使用T或者const T,ownersh...

C++ 只能指针 auto_ptr 原理 解析 源码

By SmartPtr(http://www.cppblog.com/SmartPtr/) auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ auto_ptr
举报原因:
原因补充:

(最多只允许输入30个字)