• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Legend

            About auto_ptr

            auto_ptr 實現代碼
            auto_ptr實現代碼 (摘自<<More Effective c++>> Page 293)2006年09月11日 星期一 20:24template <class T>
            class auto_ptr
            {
            public:
                explicit auto_ptr(T*p = 0) : pointee(p){}
               
                template<class U> auto_ptr(auto_ptr<U>& r);

                ~auto_ptr(){delete pointee;}

                template<class U> auto_ptr<T>& operator=(auto_ptr<U>& r);

                T& operator*() const {return *pointee;}
                T* operator->() const {return pointee;}
                T* get() const {return pointee;}
                T* release(){
                    T* old = pointee;
                    pointee = 0;
                    return old;
                }

                void reset(T*p = 0){
                    if(pointee != p) {
                        delete pointee;
                        pointee = p;
                    }
                }

            private:
                T* pointee;
                template<class U> friend class auto_ptr<U>;
            };

            template<class T>
                template<class U>
                inline auto_ptr<T>::auto_ptr(auto_ptr<U>& r)
                : pointee(r.release()) {}

            template<class T>
                template<class U>
                inline auto_ptr<T>& operator=(auto_ptr<U>& r){
                    if(this != &r) reset(r.release());
                    return *this;
                }

            另外 SGI C++中的auto_ptr
            /*
             * Copyright (c) 1997
             * Silicon Graphics Computer Systems, Inc.
             *
             * Permission to use, copy, modify, distribute and sell this software
             * and its documentation for any purpose is hereby granted without fee,
             * provided that the above copyright notice appear in all copies and
             * that both that copyright notice and this permission notice appear
             * in supporting documentation.  Silicon Graphics makes no
             * representations about the suitability of this software for any
             * purpose.  It is provided "as is" without express or implied warranty.
             *
             */

            #ifndef __SGI_STL_MEMORY
            #define __SGI_STL_MEMORY

            #include <stl_algobase.h>
            #include <stl_alloc.h>
            #include <stl_construct.h>
            #include <stl_tempbuf.h>
            #include <stl_uninitialized.h>
            #include <stl_raw_storage_iter.h>


            #if defined(__STL_MEMBER_TEMPLATES)

            __STL_BEGIN_NAMESPACE

            template <class _Tp> class auto_ptr {
            private:
              _Tp* _M_ptr;

            public:
              typedef _Tp element_type;
              explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
              auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
              template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
                : _M_ptr(__a.release()) {}
              auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
                if (&__a != this) {
                  delete _M_ptr;
                  _M_ptr = __a.release();
                }
                return *this;
              }
              template <class _Tp1>
              auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
                if (__a.get() != this->get()) {
                  delete _M_ptr;
                  _M_ptr = __a.release();
                }
                return *this;
              }
              ~auto_ptr() __STL_NOTHROW { delete _M_ptr; }

              _Tp& operator*() const __STL_NOTHROW {
                return *_M_ptr;
              }
              _Tp* operator->() const __STL_NOTHROW {
                return _M_ptr;
              }
              _Tp* get() const __STL_NOTHROW {
                return _M_ptr;
              }
              _Tp* release() __STL_NOTHROW {
                _Tp* __tmp = _M_ptr;
                _M_ptr = 0;
                return __tmp;
              }
              void reset(_Tp* __p = 0) __STL_NOTHROW {
                delete _M_ptr;
                _M_ptr = __p;
              }

              // According to the C++ standard, these conversions are required.  Most
              // present-day compilers, however, do not enforce that requirement---and,
              // in fact, most present-day compilers do not support the language
              // features that these conversions rely on.
             
            #ifdef __SGI_STL_USE_AUTO_PTR_CONVERSIONS

            private:
              template<class _Tp1> struct auto_ptr_ref {
                _Tp1* _M_ptr;
                auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
              };

            public:
              auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
                : _M_ptr(__ref._M_ptr) {}
              template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW
                { return auto_ptr_ref<_Tp>(this->release()); }
              template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
                { return auto_ptr<_Tp1>(this->release()); }

            #endif /* __SGI_STL_USE_AUTO_PTR_CONVERSIONS */
            };

            __STL_END_NAMESPACE
            #endif /* member templates */

            #endif /* __SGI_STL_MEMORY */


            // Local Variables:
            // mode:C++
            // End:
             
            auto_ptr 注意事項

            1.auto_ptr不能共享管理的指針的所有權,并且指針是從堆上分配的
            2.不能用于管理指針數組,因為它在析構的時候調用的是delete而不是delete[];并且c++類庫中還沒有具有auto_ptr語意學的指針數組。
            3.auto_ptr是解決特殊問題的智能指針的一種,它和引入了引用記數的是智能指針是不一樣的,一般來講,根據auto_ptr的特性,應用unconstant是一種不安全的做法。
            4.它不能應用容器中,因為這會涉及到copy以及assignment,這是不安全的,在語言以及庫中已經做了預防,會在編譯時報錯。
            總體來說如果把auto_ptr作為函數自變量或者返回值來用的話,就好像把函數內棧上分配的空間地址返回,很不安全。

            posted on 2007-04-16 00:21 Legend 閱讀(219) 評論(0)  編輯 收藏 引用

            国产美女久久精品香蕉69| 久久久久久精品免费看SSS| 狠狠色噜噜色狠狠狠综合久久| 无码国内精品久久综合88| 精品熟女少妇aⅴ免费久久| 狠狠人妻久久久久久综合蜜桃 | 久久精品成人免费网站| 精品99久久aaa一级毛片| 久久夜色精品国产噜噜亚洲a| 2021最新久久久视精品爱| 国产精品久久午夜夜伦鲁鲁| 中文精品久久久久国产网址| www亚洲欲色成人久久精品| 久久国产成人午夜aⅴ影院| 久久久久久久久久久久久久| 久久亚洲欧美日本精品| 久久国产精品无码网站| 99久久这里只精品国产免费| 天天久久狠狠色综合| 久久人人爽人人人人爽AV| 97精品国产97久久久久久免费| 亚洲国产精品高清久久久| 国产精品久久久天天影视香蕉 | 97久久国产亚洲精品超碰热| 久久精品国产亚洲精品| 亚洲精品无码成人片久久| 色8激情欧美成人久久综合电| 久久棈精品久久久久久噜噜| 亚洲人成电影网站久久| 久久国产成人| 久久精品中文字幕一区| 91精品婷婷国产综合久久| 国产精品一久久香蕉国产线看观看| 久久人人爽人人爽人人片av麻烦 | jizzjizz国产精品久久| 国产aⅴ激情无码久久| 少妇久久久久久被弄到高潮| 久久se精品一区精品二区国产| 四虎国产精品免费久久5151 | 国产成人无码精品久久久免费| 国产精品久久久亚洲|