日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > Boost源碼學習---scoped_ptr.hpp

Boost源碼學習---scoped_ptr.hpp

來源:程序員人生   發(fā)布時間:2014-10-17 02:42:07 閱讀次數(shù):2415次

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

#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;//原生態(tài)指針 //將復制構造函數(shù)和賦值操作符聲明為私有,不允許在類外使用,這樣就限制了其所有權的轉讓 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; //顯示構造函數(shù),必須顯示調(diào)用 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 //參數(shù)為auto_ptr時的構造函數(shù) //p.release()設auto_ptr為NULL,返回其內(nèi)部指針 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 //析構函數(shù),析構對象,釋放內(nèi)存 ~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,再調(diào)用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是因為不允許轉讓使用權,不支持拷貝和復制,不符合容器對元素的要求。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品久久久久久久久久 | 欧美日韩国产精品综合 | 最近中文字幕在线观看视频 | 久久久极品 | 一区二区三区欧美在线 | 91av视频网| 欧美国产日韩视频 | 亚洲福利片 | 色综合久久88色综合天天 | 91麻豆精品91久久久久久清纯 | 久久999精品 | 国产黄| 国产小视频在线播放 | 亚洲一区国产精品 | 精品视频999| 激情视频国产 | 在线观看日韩一区 | 久久成人免费视频 | 色综久久 | 天天操综合网 | 亚洲精品二三区 | 天堂在线www| 亚洲欧美日韩在线 | 婷婷激情综合网 | 精品国产一二三区 | 免费福利视频一区二区三区 | 国产一区二区三区视频 | 中文资源在线观看 | 亚洲欧洲网站 | 久久久久成人精品 | 日韩精品一区二区三区中文在线 | 欧美亚洲第一区 | 中文字幕日韩欧美 | 色综合久久88色综合天天 | 亚洲一区二区精品视频 | 99久久精品国产免费看不卡 | 国产91成人在在线播放 | 日韩中文在线 | 亚洲欧洲精品成人久久奇米网 | 精品国产一区二区三区不卡蜜臂 | 欧美成人免费在线视频 |