◀ANSI版開発トップへ
  • 3320 newの失敗の検出方法
    • 3321 Re:newの失敗の検出方法
  • [3320] newの失敗の検出方法 もか 2003年11月30日 16:47

    VC6はnew失敗時にはNULLを返すけど、すくなくともBCC551/MinGWでは std::bad_alloc 例外が発生します。
    サクラエディタは、newに対しては「確保に失敗しない」ことを前提にしているのが現状ですが、
    異なるコンパイラ間でも統一した方法でエラー検出ができないものでしょうか...
    調べた限りでは、
    NULLに統一したくてもBCC551ではnothrowが効かないことがある。
    VC6では operator delete( size_t, nothrow_t& ); が未宣言。
    VC7xではnewヘッダをインクルードするかしないかで動作が変わる。
    set_new_handler()を使う場合もstaticなオブジェクトが、それより先にnewを実行するかもしれない。
    結局、下記のソースみたく書かないといけないのでしょうか。
    私はこの辺の仕様と実装を理解していないので、フォロー願います。

    #include <new>
    ...
    class Hoge *p = NULL;
    try{
    p = new Hoge();
    }catch( std::bad_alloc ){
    p = NULL;
    }catch(...){
    }

    if( !p ){
    // エラー、しかるべき対処を。
    }
    • [3321] Re:newの失敗の検出方法 ryoji 2003年12月03日 12:11

      ▼ もかさん
      > set_new_handler()を使う場合もstaticなオブジェクトが、それより先にnewを実行するかもしれない。

      #pragma init_seg(lib)
      で、他のオブジェクトが作成される前にset_new_handler()できるみたいです。
      http://support.microsoft.com/?kbid=167733