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

___

■ CPPでよくある間違い


___

■ ポインタの2重解放

___

■ コピーのかわりにmemcpyを使う

POINT クラスがリファレンス先( ポインタ )をもつ場合は 単なる bit 単位のコピーでは論理的なコピーにならない。
    string a = "test";
    string b = a;

    // リファレンス先が共有されるので2重に解放される。    
    memcpy( &b, &a, sizeof(a) )
realloc も同様にストレージが移動する際は bit 単位のコピーが必要になる。 オブジェクトの配列を利用するときには注意すること。
___

■ タイプセーフでない関数をつかう

クラスのインスタンスは場合によって仮想関数テーブルのポインタをもつため "型を無視した操作" は破壊する可能性がある。
    class T {
      public:
        virtual void vfunc(){}
    };

    void test( T *ptr ) {
      // 仮想関数をコールすると落ちる。
      ptr->vfunc();
    } 
        
    T obj;
    memset( &obj, 0, sizeof(T) ) ;
    test( &obj );
___

■ コピー操作によってリソースを2重に開放する

    class String {
     public:
      String() : m_data( new char[256] ){}
      ~String() {
        printf( "dtor %X\n", m_data );
        delete m_data;
      }

     private:
      char *m_data;
    };

    {
      String s;
      {
        // ここで m_data がコピーされるので 2重に delete される。
        String st = s;
      }
    }  

そこでポインタを内部にもつクラスはコピーする気がないならばコピーを禁止をしてしまう。 コピーさせないか、DeepCopy をさせる。
    private:
      String( const String &);
      void operator =( const String &);


NINJAIDX 12