new 演算子の処理は自前で定義することでカスタマイズできる。
■ perator newをオーバーライドする
    メモリを確保する処理をオーバーライドする。
    void *operator new( size_t sz ) {
      gCnt ++;
      return malloc( sz );
    }
    void operator delete( void *p ) {
      gCnt --;
      free( p );
    }
■ 追加の情報をわたす
    operator new() は引数に応じたものが呼ばれる。
    最初の size_t 引数は必須の項目。その後は任意。
    デバッグ情報をうけとる operator new では 2つの引数を追加する。
    operator new( size_t sz, const char *file, int line ) {
    }
    int *a = new( __FILE__, __LINE__ ) int[4];
    #define NEW  new( __FILE__, __LINE__  )
    int *a = NEW int[4];
■ mallocする領域に追加する
    確保するメモリの前後にマークをつけることでメモリ破壊を検地する。
    void *operator new( size_t worksz ) {
      int sz = worksz + sizeof( int ) * 4;
      char *p = (char *)malloc( sz );
      int *pt = (int *)p;
      pt[0] = worksz;
      pt[1] = 12345678;
      
      pt = p + sizeof( int ) * 2 + worksz;
      pt[0] = 12345678;
      
      return p + sizeof(int)*2;
    }    
■ malloc.のように失敗しても NULL を返さない
    //  これは OK
    void *p = malloc( 1024*1024*1024 );
    if ( p == 0 ) {
      printf("malloc fail\n");
    }
    // new は失敗すると Exception をなげる
    class Test{
      int i;
    };
    try {
      Test *p = new Test[350*1000*1000];
    }
    // ここで補足しないと 
    catch(...){
      printf("fail new\n");
    }        
  int *p = new( std::nothrow ) int[350*1000*1000];
  
  if ( p == NULL ) {
    printf( "new fail" );
  }
    class Test
    {
      int i;
     public:
      Test(){
        printf("Test ctor\n");
        throw( bad_alloc() );
      }
    }; 
    // Memory 確保に失敗すると NULL をかえす
    //  成功すると ctor をよぶ -> ここで Exception を投げられる可能性はある
    Test *p = new( std::nothrow ) Test[1*1000*1000];
    if ( p == NULL ) {
      printf("new fail\n");
    } 
■ 宣言しなくてもメンバ関数はstatic扱い
  DESC
    メモリブロックの指定は外からする必要あり
    void *operator new( size_t t ) {
      // `this' is unavailable for static member functions
      // MemBlk を取得する関数に this はない
      dpi( this->data );
      // この後に constructor が実行される。
      return work;
    }
    operator new ( size_t sz, void *memBlk ) {
        ...
    }
    new( gWork ) Array();
■ 初期化リストは必ず記述
  WARNING
    仮引数は _data とする
      foo()::foo(int _data) 
      : data(_data)