• <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)  編輯 收藏 引用

            久久香蕉一级毛片| 色8激情欧美成人久久综合电| 中文字幕热久久久久久久| 久久中文字幕人妻丝袜| 久久久久久精品久久久久| av午夜福利一片免费看久久| 久久综合精品国产一区二区三区| 国产精品久久久香蕉| 久久精品国产精品青草| 青草久久久国产线免观| www.久久热.com| 久久www免费人成看片| 国产女人aaa级久久久级| 一本一道久久综合狠狠老| 成人精品一区二区久久| 国产成人精品三上悠亚久久| 91精品国产综合久久香蕉| 无码人妻精品一区二区三区久久久| 色综合久久中文综合网| 欧美一区二区三区久久综 | 久久精品中文字幕大胸| 色成年激情久久综合| 久久午夜无码鲁丝片| 亚洲成av人片不卡无码久久 | 波多野结衣久久| 久久久精品国产亚洲成人满18免费网站 | 久久99久久无码毛片一区二区| 亚洲AV日韩精品久久久久久久| 久久中文精品无码中文字幕 | 香蕉久久久久久狠狠色| 国产免费久久精品丫丫| 久久精品国产99国产精品| 97精品国产97久久久久久免费| 精品国产乱码久久久久久1区2区| 伊人久久综合成人网| 久久天天躁狠狠躁夜夜avapp | 亚洲欧美成人久久综合中文网| 久久无码一区二区三区少妇| 久久久不卡国产精品一区二区| 久久久WWW成人免费精品| 精品久久久久成人码免费动漫|