トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C++
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索

___

■ SharedPointer(シェアードポインタ)


  DESC
    SmartPtr のコピーの問題点を改良したポインタクラスのこと。
    参照カウンタをもち, どの変数からも参照されない時点で解放する。


    ThreadSafe な設計である. ( CntRef の操作時に排他制御がされる. )
       -> ( SharedPointer を Thread( Worker ) で共有しなければ OK  )

  POINT
    生のポインタをかえすかわりに, SharedPointer を返せば OK 

     // ヒープにTestオブジェクトを生成
     // この時点で参照カウントはこの時点で1である
     boost::shared_ptr< Test> p(new Test());  // p.cntRef = 1;

     {
       boost:shared_ptr< Test> pp;

       // スマートポインタをコピーする(参照カウントが+1される)
       pp = p;       // pp.refCnt = 2; p.refCnt = 1;  // 相手先は cntRef を copy してさらに ++ !
       std::cout < <  "pp will destruct" < <  std::endl;

       // このスコープを抜けたときにppはなくなり ppが指しているTestオブジェクト
       // への参照カウントは-1されるが 、まだ0ではないためTestオブジェクトは開放されない。
     }

     // pが指しているTestオブジェクトはまだ開放されていない


    ButtonRef Button::create()  // RawPointer のかわりに返す。
    {
      return ButtonRef( new Button() );
     }

    class Window {

      ButtonRef m_button;   
     };      
  
    // 自動的に joint も削除される
    delete wnd;  
___

■ shared_ptr

    template<  class T >
    class SharedPtr {

      public:
        SharedPtr( T *ptr ) : m_ptr(ptr), m_cnt( NULL ){
          m_cnt = new int;
          *m_cnt = 1;
        }

        // 死ぬときに参照数をへらす。
        // 0になったら 実体を解放する。
        ~SharedPtr() {
          release();
        }

        // SharedPtr 同士のコピーをする場合は参照数が増やす。
        void operator=( SharedPtr &rhs ) {

          // 今指している参照を離す。
          release();

          // 相手と同じ参照をもつ。
          m_cnt = rhs.m_cnt;
          m_ptr = rhs.m_ptr;
          (*m_cnt) ++;

        }

        void release() {
          (*m_cnt) --;

          if ( *m_cnt == 0 ) {
            delete( m_ptr );
            delete( m_cnt );
          }
        }

      private:
        // 実体
        T *m_ptr;
        
        int *m_cnt;
    };


NINJAIDX 12