多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > Boost源碼學習---scoped_ptr.hpp

Boost源碼學習---scoped_ptr.hpp

來源:程序員人生   發布時間:2014-10-17 02:42:07 閱讀次數:2411次

scoped_ptr是一個智能指針,包裝了指向堆上內存的指針。它對指針所有權加以限制,不能轉讓指針所有權,一旦scoped_ptr獲取了指針的管理權,便不再釋放,無法再從其取回來,就像scope意思一樣,指針智能在作用域使用,不能轉讓出去。一旦離開scoped_ptr的作用域,將調用它的析構函數,釋放指針,不用手動釋放。下面是它的源代碼:

#ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // http://www.boost.org/libs/smart_ptr/scoped_ptr.htm // #include <boost/config.hpp> #include <boost/assert.hpp> #include <boost/checked_delete.hpp> #include <boost/smart_ptr/detail/sp_nullptr_t.hpp> #include <boost/detail/workaround.hpp> #ifndef BOOST_NO_AUTO_PTR # include <memory> // for std::auto_ptr #endif namespace boost { // Debug hooks #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) void sp_scalar_constructor_hook(void * p); void sp_scalar_destructor_hook(void * p); #endif // scoped_ptr mimics a built-in pointer except that it guarantees deletion // of the object pointed to, either on destruction of the scoped_ptr or via // an explicit reset(). scoped_ptr is a simple solution for simple needs; // use shared_ptr or std::auto_ptr if your needs are more complex. template<class T> class scoped_ptr // noncopyable { private: T * px;//原生態指針 //將復制構造函數和賦值操作符聲明為私有,不允許在類外使用,這樣就限制了其所有權的轉讓 scoped_ptr(scoped_ptr const &); scoped_ptr & operator=(scoped_ptr const &); typedef scoped_ptr<T> this_type; //重載為私有,不支持比較 void operator==( scoped_ptr const& ) const; void operator!=( scoped_ptr const& ) const; public: typedef T element_type; //顯示構造函數,必須顯示調用 explicit scoped_ptr( T * p = 0 ): px( p ) // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_constructor_hook( px ); #endif } #ifndef BOOST_NO_AUTO_PTR //參數為auto_ptr時的構造函數 //p.release()設auto_ptr為NULL,返回其內部指針 explicit scoped_ptr( std::auto_ptr<T> p ) BOOST_NOEXCEPT : px( p.release() ) { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_constructor_hook( px ); #endif } #endif //析構函數,析構對象,釋放內存 ~scoped_ptr() // never throws { #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) boost::sp_scalar_destructor_hook( px ); #endif boost::checked_delete( px ); } void reset(T * p = 0) // never throws { BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors //把p轉換為scoped_prt,再調用swap交換 this_type(p).swap(*this); } //重載解引用,返回指針指向的對象 T & operator*() const // never throws { BOOST_ASSERT( px != 0 ); return *px; } //重載->,返回指針 T * operator->() const // never throws { BOOST_ASSERT( px != 0 ); return px; } //返回指針 T * get() const BOOST_NOEXCEPT { return px; } // implicit conversion to "bool" #include <boost/smart_ptr/detail/operator_bool.hpp> //交換兩個指針 void swap(scoped_ptr & b) BOOST_NOEXCEPT { T * tmp = b.px; b.px = px; px = tmp; } }; #if !defined( BOOST_NO_CXX11_NULLPTR ) template<class T> inline bool operator==( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT { return p.get() == 0; } template<class T> inline bool operator==( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_NOEXCEPT { return p.get() == 0; } template<class T> inline bool operator!=( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT { return p.get() != 0; } template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_NOEXCEPT { return p.get() != 0; } #endif template<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) BOOST_NOEXCEPT { a.swap(b); } // get_pointer(p) is a generic way to say p.get() template<class T> inline T * get_pointer(scoped_ptr<T> const & p) BOOST_NOEXCEPT { return p.get(); } } // namespace boost #endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
scoped_ptr與auto_ptr不同的是:auto_ptr可以轉讓使用權,在轉讓的時候,上一個指針失去使用權。而scoped_ptr不允許轉讓使用權。

scoped_ptr和auto_ptr都不能放在容器,auto_ptr是因為它只允許一個auto_prt使用指針,而scoped_ptr是因為不允許轉讓使用權,不支持拷貝和復制,不符合容器對元素的要求。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 我爱我色成人网 | 日韩在线手机看片免费看 | 黄色avav| 欧美日韩精品国产一区二区 | 国产精品亚洲一区二区三区 | 男女做爽爽免费视频 | 国产成人精品一区二区免费视频 | 日韩综合久久 | 欧美videosex性欧美成人 | 国产精品久久一区二区三区 | 国产亚洲精品资源在线26u | 午夜免费体验 | 天天更新天天久久久更新影院 | 免费网站看v片在线香蕉 | 国产亚洲欧洲国产综合一区 | 五月综合视频 | 精品国产人成亚洲区 | 成人在线网 | 波多野结衣一二三区 | 黑人最猛性free护士hd | 亚洲第1页| 亚洲永久免费网站 | 日本福利片午夜免费观着 | 一区二区三区在线播放 | 欧美日韩精品一区二区 | 免费人成在线观看视频色 | www.色亚洲| 国产美女激情视频无打码 | 一区二区三区视频 | 国产视频日本 | 综合亚洲欧美日韩一区二区 | 欧美综合图区亚欧综合图区 | 在线综合亚洲欧美网站天堂 | 久久久亚洲欧洲国产 | 欧美视频精品 | 精品推荐 国产 | 无遮挡在线视频 | 交在线观看网站视频 | 久久久全国免费视频 | 全免费a级毛片免费看不卡 全网毛片 | 超乳w真性中出し冲田杏梨101 |