スマートポインタ
C++はnewすると自前でdeleteしないとメモリが食いっぱなしです。いわゆるメモリリークというバグですね。JAVAとかは時々使われなくなったメモリがないか調べて削除してくれます。いわゆるガーベージコレクタというやつですね。
で、C++でも参照先をしらべて勝手にdeleteしてくれるようにできないか?という考えで生まれたのがスマートポインタです。ポインタ自身が自分の参照先を数えていて誰も参照しなくなったら自分でdeleteしてくれるというおりこうさんです。
んで、ちょいといろいろと訳アリなようで気がふれてしまったのか、作ってしまいました。
template< class T > class smart_ptr { public: smart_ptr():m_pnCounter( NULL ),m_ppObject( NULL ){} template< class Y > smart_ptr( const smart_ptr< Y >& p ){ if( p.m_pnCounter == NULL ){ m_pnCounter( NULL ); m_ppObject( NULL ); return; } m_ppObject = p.m_ppObject; m_pnCounter = p.nCounter; (*m_pnCounter)++: } smart_ptr( T* p ){ m_ppObject = new T*; m_pnCounter = new unsigned int; *m_ppObject = p; *m_pnCounter = 1; } template< class Y > smart_ptr< Y >& operator =( smart_ptr< Y >& p ){ Delete(); m_pnCounter = p.m_pnCounter; m_ppObject = p.m_ppObject; (*m_pnCounter)++; return *this; } template< class P > smart_ptr< P >& operator =( P* p ){ Delete(); if( p == NULL ){ return *this; } m_ppObject = new T*; m_pnCounter = new unsigned int; *m_pnCounter = 1; *m_ppObject = p; return *this; } virtual ~smart_ptr(){ if( m_ppObject == NULL ){ return; } (*m_pnCounter)--; if( *m_pnCounter == 0 ){ if( *m_ppObject != NULL ){ delete *m_ppObject; } delete m_ppObject; delete m_pnCounter; } return; } T& operator*() const{ return **m_ppObject; } T* operator->() const{ return *m_ppObject; } bool operator==( T* p ){ if( m_ppObject == NULL ){ return p == NULL; }else{ return *m_ppObject == p; } } bool operator ==( smart_ptr< T >& p ){ m_ppObject == p.m_ppObject; } protected: void Delete(){ if( m_ppObject == NULL ){ return; } if( *m_ppObject != NULL ){ delete *m_ppObject; *m_ppObject = NULL; } (*m_pnCounter)--; if( *m_pnCounter == 0 ){ delete m_ppObject; delete m_pnCounter; } m_ppObject = NULL; m_ppObject = NULL; return; } private: unsigned int* m_pnCounter; T** m_ppObject; };
いや、苦労するかとおもったけどやっぱり苦労しましたが思ったほどの苦労では無かったですがやっぱり4時過ぎになったという精神的苦労が後から来ました。
簡易的ではありますが、それでもboostのshared_ptrと同等くらいの働きをするはずです。しかし、デバッグまでやる体力が残っていないのでちゃんと動くかどうか妖しいです。だれかリークチェックおねがい(ぉぉぉ