ステップ書きSTL:カスタムboost::shared_ptr
ある有名なマスターは、スマートポインタがあってから、前回メモリの漏洩が発生したのは2004年に実習生になったときだと言った.
このように、スマートポインタの威力は無限で、8年もメモリの漏洩が発生していないことを示しています.ptrの実装案は、今日shared_を提供します.ptrと実装バージョン、新しい標準でauto_ptrはもう存在しません(実は存在しなくても大丈夫ですが、使いたいならいつでも自分で書いてもいいですよ)
代わりにboostを導入したshared_ptrスマートポインタと他の3つは、auto_よりもカウント型のクラスポインタを参照しています.ptr.容器に入れるタイプとして重要な利点がありますptrはできない!
Effective C++によるshared_ptrの説明では、彼の内部実装を簡単に考えられます.以下は私が書いた実装バージョンです.
ここで、参照カウントの実装では、クラスのカウントを識別するためにstaticメンバーを使用します.説明に値するのは、主にすべての構造関数と付与関数で静的関数change_を使用することです.count_numは、true表現に1を加え、false表現に1を減らし、構造関数で対応する操作を実行し、比較的簡単で、基本的にテストされています.コメントの場所はテストカウントで使用される出力文です!
このように、スマートポインタの威力は無限で、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を減らし、構造関数で対応する操作を実行し、比較的簡単で、基本的にテストされています.コメントの場所はテストカウントで使用される出力文です!