6

そのようなコードがあります:

#include <iostream>

int main(){
    for(;;){
        int* ptr = new (std::nothrow) int;
        if(ptr == 0){
            std::cout << 0 << std::endl;
            break;
        }
    }
    std::cin.get();
    return 0;
}

ただし、このプログラムはまだ std::bac_alloc 例外をスローしますが、 new は std::nothrow パラメータで呼び出されます。このプログラムは Visual C++ 2010 でコンパイルされています。例外がスローされるのはなぜですか?

編集:

mingw の Windows で g++ を使用すると、すべて正常に動作します。

4

3 に答える 3

7

0としてフォーマットする必要があります"0"。これには数バイトかかります。きっとそれが原因です。ブレークポイントを設定するstd::bad_alloc::bad_alloc と、確実にわかります。

于 2011-09-26T12:57:13.403 に答える
1

VC2010 からサンプルを実行しました。スローするのは new(nothrow) ではなく、__security_check_cookieです。

于 2011-09-26T13:41:19.887 に答える
-2

これは、それがまだ投げている理由と、投げないようにする方法を説明しています。nothrow無視されているようです。

それでもCランタイムライブラリにスローされないバージョンのnewが必要な場合は、プログラムをnothrownew.objにリンクします。ただし、nothrownew.objとリンクすると、標準C++ライブラリのnewは機能しなくなります。

私はこれについてかなり詳細な記事を見つけましたが、それはちょっと古いです(VC 6)が、おそらく問題はまだ残っています。throw()ところで、VCは機能のすべての仕様を無視します。

演算子new(std :: nothrow)がとにかく例外をスローする場合

于 2011-09-26T12:49:23.160 に答える