• <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 閱讀(228) 評論(0)  編輯 收藏 引用

            精品久久人妻av中文字幕| 狠狠色丁香久久综合婷婷| 久久亚洲AV无码西西人体| 久久精品成人免费国产片小草| 国产 亚洲 欧美 另类 久久| 一97日本道伊人久久综合影院| 久久久久亚洲av无码专区导航| 久久精品亚洲欧美日韩久久| 99久久99久久精品国产片果冻| 亚洲综合精品香蕉久久网97| 亚洲精品乱码久久久久久蜜桃图片 | 9191精品国产免费久久| 久久国产亚洲精品| 久久久久人妻一区精品| 国産精品久久久久久久| 国产婷婷成人久久Av免费高清| 久久久久久久久久久久中文字幕| 热久久视久久精品18| 国产精品99久久久精品无码| 国产精品乱码久久久久久软件| 亚洲国产精品嫩草影院久久| 无码国内精品久久人妻麻豆按摩| 看全色黄大色大片免费久久久| 久久综合伊人77777麻豆| 久久久久精品国产亚洲AV无码| 亚洲精品无码久久久久sm| 青青草国产成人久久91网| 欧美麻豆久久久久久中文| 色偷偷91久久综合噜噜噜噜 | 国产精品99久久久久久董美香| 亚洲国产精品成人AV无码久久综合影院 | 国产精品国色综合久久| 老司机国内精品久久久久| 三级片免费观看久久| 97久久精品无码一区二区天美| A级毛片无码久久精品免费| 影音先锋女人AV鲁色资源网久久| 2021久久国自产拍精品| 天天躁日日躁狠狠久久| 久久久黄色大片| 久久99热这里只频精品6|