ステップ書きSTL:カスタムboost::shared_ptr

2425 ワード

ある有名なマスターは、スマートポインタがあってから、前回メモリの漏洩が発生したのは2004年に実習生になったときだと言った.
このように、スマートポインタの威力は無限で、8年もメモリの漏洩が発生していないことを示しています.ptrの実装案は、今日shared_を提供します.ptrと実装バージョン、新しい標準でauto_ptrはもう存在しません(実は存在しなくても大丈夫ですが、使いたいならいつでも自分で書いてもいいですよ)
代わりにboostを導入したshared_ptrスマートポインタと他の3つは、auto_よりもカウント型のクラスポインタを参照しています.ptr.容器に入れるタイプとして重要な利点がありますptrはできない!
 
Effective C++によるshared_ptrの説明では、彼の内部実装を簡単に考えられます.以下は私が書いた実装バージョンです.
template
class shared_ptr
{
	typedef _Ty  element_type;
	typedef _Ty* pointer;
private:
	_Ty* _ptr;
	static std::size_t n_count;
	static void change_count_num(bool )throw();

public:

	explicit shared_ptr(pointer p=0 )throw()
		:_ptr(p)
	{//             
		shared_ptr::change_count_num(true);
		 //std::cout<<:n_count shared_ptr="" :_ptr="" sptr.get="" shared_ptr::change_count_num="" operator="(const" _ptr="sPtr.get();" return="" template="" other="">
	shared_ptr(const shared_ptr &sPtr)throw()
		:_ptr( sPtr.get() )
	{//        ,             
		shared_ptr::change_count_num(true);
	}

	template
	shared_ptr& operator= (const shared_ptr &sPtr)throw()
	{//     
		_ptr = sPtr.get();
		shared_ptr::change_count_num(true);
		return *this;
	}

	~shared_ptr()throw()
	{//    ,       0
		if(shared_ptr::n_count == 0)
		{
			delete _ptr;
			_ptr = 0;
		}
		 
	shared_ptr::change_count_num(false);	}

	pointer get()const throw()
	{//get ,RAII     ,  Effective C++
		return _ptr;
	}

	void release()throw()
	{//        ,   0
		_ptr = 0;
		shared_ptr::change_count_num(false);
	}

	pointer operator-> ()throw(){
		return _ptr;
	}
	element_type operator* (){
		return *_ptr;
	}
	operator bool()const throw(){
		return _ptr;
	}

};

template
 std::size_t shared_ptr<_ty>::n_count = -1;

 template
 void shared_ptr<_ty>::change_count_num (bool flag)
 {
	 flag? ++shared_ptr<_ty>::n_count : --shared_ptr<_ty>::n_count;
 }

ここで、参照カウントの実装では、クラスのカウントを識別するためにstaticメンバーを使用します.説明に値するのは、主にすべての構造関数と付与関数で静的関数change_を使用することです.count_numは、true表現に1を加え、false表現に1を減らし、構造関数で対応する操作を実行し、比較的簡単で、基本的にテストされています.コメントの場所はテストカウントで使用される出力文です!