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

___

■ new


  DESC
    new で確保する際の メモリサイズ は new TYPE で決まる
    new は Constructor をコールする

___

■ new new[] delete delete[] を間違えないこと

~QUIT{ printf"quit"; } とすれば, 1度しか call されない.
      int main( void )
      {
        Foo *p = new Foo[8];
        for( unsigned int i=0; i< 8; i++ ){  p[i].srv();  } 
        delete p;  // gcc では core dump 
        return 0;
      }
new[] の際に mem blk に 要素数を埋め込む. new -> [memtag][mem...] 0x01000000 new[] -> [memtag][pad][要素数][mem...] 0x01000010 -> memtag を取得してみる. MEMTAG *ptag = static_cast< MEMTAG *>(p) - 1;
___

■ newをカスタマイズする(placement new)

new は operator new() をオーバーロードすることでカスタマイズできる。 カスタマイズする目的はメモリのアロケートを独自の方式にすること。 new の後に () にパラメータを与えることで、アロケータにパラメータを渡すことになる。 あらかじめ用意したメモリ領域(メモリプール )からアロケートする。 最初に大きめのサイズをまとめて確保して、切り出して使うのがおおまかな流れになる。
    // 最初にまとめてメモリ領域を確保
    static char memPool[ 1024 ];

    void *operator new( size_t sz, char *buf ) {
      return sBuf;
    }  

    {
      Test *p = new( memPool ) Test();
    }
WARNING 返すアドレスは以下の条件を満たす必要がある。
     要求されたサイズ ( sz )よりも大きい。
     適切にアランメントされたアドレスになっている。
        ( クラスのメンバに double を含む可能性があるなら 8で割り切れるアドレスを返す必要がある )
POINT new を overwride する場合は, 対応する delete も overwride するケースが多い. Pool からとった場合は, 自分で解放する. Component したクラスが OperatorNew を定義していても OverwriteNew は呼ばれない Component したクラス自身を new した際にくる.
    class Bar {
      Foo f;
    }  
    Bar *b = new Bar();  // f の生成は Bar の生成場所で INIT される. 
メモリリークを防ぐには以下のカスタマイズバージョンを使う。
   #if _DEBUG
   #  define NEW new( __FILE__, __LINE__ )
   #else
   #  define NEW new 
   #endif
WARNING クラス内で new/delete を定義する場合は, NEW の定義を変えることでコンパイルできなくなる 同様に delete もカスタマイズできる。 独自にアロケートしたメモリを解放する処理をかいておく。
    void operator delete( void *ptr ) {
      ...
      // 
    }
___

■ new で realloc できるか ?

DESC できない POINT new を使う理由はコンストラクタをコールしてくれること
___

■ global new

DESC class 単位ではない new class 単位が Local WARNING STL などはデフォルトで GlobalNew を利用している可能がある.

NINJAIDX 12