また新NULLを返し載。
-
23-08-2019 - |
質問
知っていることによるC++の標準場の新に失敗したメモリを割り当てとなってい捨std::bad_allocます。があると聞きコンパイラなどのVC6(CRT施行?) 付着しにくいです。はたしてそうなのだろうか?いうことでチェックのためのNULL後のひと新しい算するコードを見ても醜い.
解決
VC6した非対応のデフォルトではこの点に関するVC6の new
返される 0
( NULL
).
こちらはMicrosoft KB条この問題とそれへの対処のカスタム new
ハンドラ:
もし、古いコードのために書かれたものVC6行動が取得できる行動と新しいMSVCコンパイラ(のようなもの7.0以降連携により、オブジェクトという名前のファイル nothrownew.obj
.が実際に かなり複雑なルール の7.0 7.1コンパイラ(VS2002とVS2003)にするかどうかを判定するデフォルト以外を投げ new
.
この MS洗浄す に8.0(VS2005)—現在では常にデフォルトでは、投新たなければ具体的にはリンク nothrownew.obj
.
ることはできするかどうかを指定します new
を返す 0
の代わりに投げ std::bad_alloc
を使用 std::nothrow
パラメータ:
SomeType *p = new(std::nothrow) SomeType;
この表示の仕事をVC6、この方法は機械的に固定のコードにすべてのコンパイラでコンパイルできない直し、既存のエラー処理する。
他のヒント
私は、割り当て試行の後にNULLをチェックすることはほとんど無益の練習であることを(やや論争の)意見を追加したいと思います。あなたのプログラムは、これまでそのような状況に遭遇した場合、チャンスはあなたが速い終了するよりもはるかに多くを行うことはできませんです。これは、任意の割り振りの試みも失敗する可能性が非常に高いのです。
NULLをチェックしなければ、あなたのその後のコードは、比較的ユニークな(かつ簡単にデバッグ)終了条件で、プログラムの高速を終了する傾向がNULLポインタ、間接参照しようとしていました。
私はNULLのチェックのあなたを話をするつもりはないよ、それは確かに良心的なプログラミングです。しかし、あなたはおそらく、いくつかの回復情報を保存することができ非常に特殊なケースでない限り、(より多くのメモリを割り当てることなく)、それからずっと得る、またはなど自由重要度の低いメモリ、しかし、これらの例は、ほとんどの人のために比較的まれになりません。
この考えると、私は個人的に、bad_allocをスローするようにコンパイラを信頼したい - 。少なくとも、ほとんどの場合、
のC++仕様では常にスロー std::bad_allocきだ新しいのないparamsが、もちろんですが非対応のコンパイラでコンパイル.
いないコードに準拠させるため、非c++対応のコンパイラになってる。VC6の一つとして重要視しています。
ておくと良いでしょうが常に設定ポインタがNULL後に削除します。いことを確認するために、NULLが求められる。
もっとも、これはオプショングループコード:
オプション1:設定はご自身の新規ハンドラ
に、安全にクリーンアップコードする電話: set_new_handler ます。
そのチェックNULLの場合にハンドラとスロー std::bad_allocい場合はNULLが返されます。
の場合のような例外、そしてこれは最良のベット。場合にNULLを返しまいをすることによって捕内に新規ハンドラです。
オプション2:使用過新
C++の標準ヘッダファイルを定義する構造体nothrowは空です。利用することができますオブジェクトのこのstruct内に新規取得し、その過負荷するバージョンは常にNULLを返します。
void* operator new (size_t size, const std::nothrow_t &);
void* operator new[] (void *v, const std::nothrow_t &nt);
そこでコード:
char *p = new(std::nothrow) char[1024];
こちらは 良いrefrenceのためにさらに読む