auto_ptr:

原创 2004年10月03日 02:14:00

附录:auto_ptr的实现代码,来自Nicolai M. Josuttis<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

/* class auto_ptr
 * - improved standard conforming implementation
 */
namespace
 std {
    // auxiliary type to enable copies and assignments (now global)
    template<class Y>
    struct auto_ptr_ref {
        Y* yp;
        auto_ptr_ref (Y* rhs)
         : yp(rhs) {
        }
    };

    template<class T>
    class auto_ptr {
      private:
        T* ap;    // refers to the actual owned object (if any)
      public:
        typedef T element_type;

        // constructor
        explicit auto_ptr (T* ptr = 0) throw()
         : ap(ptr) {
        }

        // copy constructors (with implicit conversion)
        // - note: nonconstant parameter
        auto_ptr (auto_ptr& rhs) throw()
         : ap(rhs.release()) {
        }
        template<class Y>
        auto_ptr (auto_ptr<Y>& rhs) throw()
         : ap(rhs.release()) {
        }
        
        // assignments (with implicit conversion)
        // - note: nonconstant parameter
        auto_ptr& operator= (auto_ptr& rhs) throw() {
            reset(rhs.release());
            return *this;
        }
        template<class Y>
        auto_ptr& operator= (auto_ptr<Y>& rhs) throw() {
            reset(rhs.release());
            return *this;
        }
        
        // destructor
        ~auto_ptr() throw() {
            delete ap;
        }

        // value access
        T* get() const throw() {
            return ap;
        }
        T& operator*() const throw() {
            return *ap;
        }
        T* operator->() const throw() {
            return ap;
        }

        // release ownership
        T* release() throw() {
            T* tmp(ap);
            ap = 0;
            return tmp;
        }

        // reset value
        void reset (T* ptr=0) throw() {
            if (ap != ptr) {
                delete ap;
                ap = ptr;
            }
        }

        /* special conversions with auxiliary type to enable copies and assignments
         */
        auto_ptr(auto_ptr_ref<T> rhs) throw()
         : ap(rhs.yp) {
        }
        auto_ptr& operator= (auto_ptr_ref<T> rhs) throw() {  // new
             reset(rhs.yp);
             return *this;
        }
        template<class Y>
        operator auto_ptr_ref<Y>() throw() {
            return auto_ptr_ref<Y>(release());
        }
        template<class Y>
        operator auto_ptr<Y>() throw() {
            return auto_ptr<Y>(release());
        }
    };
}

auto_ptr到底能不能作为容器的元素?

【摘要】对C++语言本身来说,它并不在乎用户把什么类型的对象作为STL容器的元素,因为模板类型参数在理论上可以为任何类型。比如说STL容器仅支持“值”语义而不支持“引用(&)”语义,并非因为模板类型参...
  • ysu108
  • ysu108
  • 2014年09月10日 09:38
  • 693

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

By SmartPtr(http://www.cppblog.com/SmartPtr/) auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智...
  • wang_jing_2008
  • wang_jing_2008
  • 2012年08月30日 12:50
  • 1083

std::auto_ptr的原理及使用

使用auto_ptr作为成员变量,以避免资源泄漏。防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函...
  • makenothing
  • makenothing
  • 2015年11月13日 17:38
  • 3902

C++ boost智能指针auto_ptr

auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于...
  • u011676589
  • u011676589
  • 2013年08月30日 16:40
  • 1096

std::auto_ptr 不能赋值 简析

今天试用了下std::auto_ptr, 第一次使用就出错了,尴尬啊,先还原现场:类内声明:Std::auto_ptr m_pWgt;类构造函数内赋值:m_pWgt = new Widget;大概就是...
  • webScaler
  • webScaler
  • 2010年09月18日 12:28
  • 2582

c++中的智能指针auto_ptr解析

c++中的auto_ptr是一个类,却可以像指针一样去使用。使用auto_ptr需要包含头文件#include 例如:auto_ptr ps(new string("hello"));可以像指针一样...
  • uestclr
  • uestclr
  • 2016年05月06日 10:56
  • 1587

智能指针:从std::auto_ptr到std::unique_ptr

std::auto_ptr封装动态申请对象内存返回的指针,并且其行为也和普通指针一样。最重要的一点,程序员不必记得去释放之前申请的内存,当std::auto_ptr销毁时,其封装的指针所指向的内存也会...
  • hanhuili
  • hanhuili
  • 2012年12月15日 21:38
  • 5598

c++智能指针:auto_ptr shared_ptr

1. 简介 C++程序员最痛苦的莫过于对内存的管理,由于没有像C# 和 java的内存回收机制,C++程序员在复杂的程序中容易造成内存的泄露。即使程序员十分小心,异常的产生也有可能会造成部分内存的泄...
  • gui694278452
  • gui694278452
  • 2015年06月03日 18:44
  • 2874

实现auto_ptr的两种方法

我们都知道,实现auto_ptr有两种方法:第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 20:04
  • 1173

auto_ptr 与 shared_ptr 用法和区别总结

1.auto_ptr 被复制后,将失去原来所致资源的所有权;
  • Manketon
  • Manketon
  • 2014年07月08日 12:29
  • 2077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:auto_ptr:
举报原因:
原因补充:

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