CMemoryException について

[戻る]
NOBU 2003/02/19(水) 00:03:58
今さら何をという感じがあるのですが、new のメモリ確保失敗時に
NULL を返すのか、CMemoryExceptionを投げてくれるのかがわからずこまってます。

例えば、MFCの CObList のようなクラスでは CMemoryException 
を投げると書いてあります。
MSDNで new は、標準で NULL を返すとかいてあったので、
MFCをリンクしたとたん new の動作が変わって、
CMemoryException を投げるようになるのでしょうか?

もしそうだとすると、自分のコードの new のメモリチェックで、

char* data = new char[1000];
if(data == NULL){
 // エラー処理
}

というのは、全然無意味で

char* data;
try{
 data = new char[1000];
}
catch(CMemoryException* e)
{
 // エラー処理
 e->Delete();
}

このようにするべきなのでしょうが・・・
もし、こうだとすると、メモリチェックを全部書き換えなくてはなりません。

手遅れになる前に、どなたかご教授お願いします。

仕様コンパイラは VC6.0 です。

NTAKA 2003/02/19(水) 10:42:04
まだ調査中なのですが、途中経過を報告をします。

結局、MFCを使用しないと、new は 0 (NULL) を返すようです。
手元の資料(プログラミング C++ 第3版)では std::bad_alloc を投げるようですが、
VC6.0 はそれより古い仕様で設計されたようです。

MFCを使用した場合 new は CMemoryException を投げるようになりました。
ということで、MFC を使用するプログラムでは、CMemoryException を
catch しなければエラーチェックできないという結論に達しました。

以下がテストしたソースです。

         char* a;
    try{
        a = new char[10000000000000000000];

        if(a == NULL){
            // 従来のエラー処理
            TRACE("NULL check\n");
        }
    }

    catch(std::bad_alloc){
        // 例外
        TRACE("std::bad_alloc\n");
    }
    catch(CMemoryException* e){
        // 例外
        e->Delete();

        TRACE("CMemoryException\n");
    }

このケースでは、 CMemoryException が呼ばれました。
ちなみに、MFCを使用しない場合

void main(void)
{
    char* a;
         try{
        a = new char[10000000000000000000];

        if(a == NULL){
            // 従来のエラー処理
            cout << "NULL check\n";
        }
    }
    catch(std::bad_alloc){
        // 例外
        cout << "std::bad_alloc\n";
    }
}

std::bad_alloc を期待したのですが、NULL が返されるようです。

以上ここまでわかったのですが、私の見解はあってるのでしょうか?
ご指摘がある方、レスをお願いします。

NEG(ねぐ) [E-Mail] [HomePage] 2003/02/19(水) 11:26:02
 こういうのがあります。
http://www2.kct.ac.jp/~srd/badalloc.html

123 2003/02/19(水) 11:48:43
HELP の "operator new" に null を返すと記載されています。

NEG(ねぐ) [E-Mail] [HomePage] 2003/02/19(水) 14:05:54
 危なさそうだけど、参考までに・・・
AfxSetNewHandler(0);

古いスレッドには追加発言できません。