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

            91久久香蕉国产熟女线看| 成人久久精品一区二区三区| 久久本道久久综合伊人| 久久久久无码精品| 久久久久se色偷偷亚洲精品av| 久久久久久久亚洲Av无码| 久久精品无码av| 久久综合久久自在自线精品自| 亚洲国产精品久久久久久| 性高朝久久久久久久久久| 国产精品久久影院| 久久久久波多野结衣高潮| 国内精品免费久久影院| 麻豆亚洲AV永久无码精品久久| 欧美粉嫩小泬久久久久久久 | 久久美女网站免费| 7777精品伊人久久久大香线蕉| 国产午夜精品理论片久久影视| 欧美日韩精品久久久免费观看| 久久精品国产亚洲综合色| 亚洲级αV无码毛片久久精品| 色99久久久久高潮综合影院 | 久久青青草原精品国产软件| 久久婷婷五月综合97色| 2019久久久高清456| 久久久久综合中文字幕 | 久久久久成人精品无码中文字幕 | 久久成人国产精品免费软件| 日韩精品国产自在久久现线拍| 色欲久久久天天天综合网| 一级做a爰片久久毛片毛片| 国产一区二区精品久久凹凸| 久久精品国产秦先生| 99久久精品无码一区二区毛片| 国内精品久久久久久99蜜桃| 一本色道久久88—综合亚洲精品| 四虎久久影院| 久久精品国产99久久久古代| 久久人人爽人人爽人人爽| 亚洲精品tv久久久久久久久| 国产人久久人人人人爽|