04/01/12 15:57
>>73
shared_ptr の コンストラクタにある、template< class Y > は、
shared_ptr< void* >( new Object() ); とかやっても
きちんと Object のデストラクタを呼び出すための仕掛け。
大雑把に書くと以下のようなコード。
struct deleter_base
{
virtual void destroy() = 0;
virtual ~deleter_base(){}
};
template< class T > struct deleter : public deleter_base
{
deleter( T * p ) : p_(p)
void destroy() { checked_delete( p_ ); }
T * p_;
};
struct shared_count
{
template< typename Y >
shared_count( Y * p ) : pd_( new deleter<Y>( p ) ) ... { ... }
// カウンタが 0 を示したときに pd_->destroy を呼ぶような処理
// これで、Y は正しく delete される。
deleter_base * pd_;
};
みたいなの。