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

___

■ SmartPointer(スマートポインタ)


  DESC
    ネイティブのポインタをラップし、参照カウントがゼロになったときに
    ポインタの参照先を自動的にdelete するクラスのこと。

    自動削除ポインタのこと。

    ポインタのような振る舞いをするクラスのこと。


  POINT
    解放忘れを防ぎたい場所でする。
    destructor のタイミングで自分が管理しているオブジェクトを解放する。
    ptr が削除されると, 参照先も自動で削除される ptr

      {
        // stack 上に SmartPointer がのる。
        std::auto_ptr< Test> p( new Test() );

          
      }  // スマートポインタオブジェクトが消滅すると Test のインスタンスは削除される。
WARNING スマートポインタはコピーをするとコピー元は NULL になる。

    class Test
    {
     public:
      Test() {
        printf( "ctor\n" );
        m_data = new char[1024];
        sprintf( m_data, "test" );
      }
      ~Test() {
        printf( "dtor\n" );
        delete m_data;
      }

      void func() {
        printf( "func %s\n", m_data );
      }

     private:
      char *m_data;
    }; 


  {
    auto_ptr< Test> p( new Test() );
    p->func();

    printf( "check Pointer %d\n", p );

    printf( "copy" );
    auto_ptr< Test> b = p;

    printf( "check Pointer %d", p );

    // p は NULL なのでクラッシュする。    
    p->func();
    b->func();
  }

___

■ スマートポインタの使いどころ

例外や if 文などの複雑なロジックがあった場合でも簡単にかける。 delete 文を省けるというよりも、どんな場合でも解放忘れがないというメリットがある。 POINT 同一スコープでアロケート、デアロケートする処理があったら使いどころ。 Python の with ステートメントみたいなもの REFERENCE with REFERENCE Dispose

      // 次のような状況でも解放漏れがおきない。
      // 解放の処理を明示する必要がない。
      {
        void func() {
          auto_ptr< File> file( new File("d:/test.txt") );
          
          try {
            if ( ... ) {
              // ここでファイルを閉じる
              return;
            }
            else if ( ... ) {
              // ここでも
              return;
            }
          } catch () {
            // ここでも
          }

          // ここでも
        }
      }
      
      
POINT boost::shared_ptr : 内部に参照カウンタをもつため 譲渡できる。 Decoration Pattern のひとつ WARNING auto_ptr ではひとつのインスタンスを複数の auto_ptr でシェアできない。 そこでコピーを禁止しておく。 ( STL 禁止 == vector< auto_ptr< T> > ) 次の場合に問題がおきる。
   auto_ptr< Test> p( new Test() );
   {
     auto_ptr< Test> pp;
     pp = p;  // 譲渡 
     
     // p が指す obj がpp の破棄によって解放 
   } 
    // インスタンスは解放すみ

___

■ 共有できるスマートポインタ

POINT 共有できない欠点を取り除いたものが shared_ptr 生のポインタと比べて次のことができる。
    // コンストラクト時に NULL にセットするので未初期化のポインタがなくなる

    SmartPointer() : m_ptr( NULL ){}

    // 
    SmartPointer< int> p;

    // ここで死んでくれる
    *p = 10;



NINJAIDX 12