ホームページ >バックエンド開発 >C++ >「new」が例外をスローせずに NULL を返す場合があるのはなぜですか?

「new」が例外をスローせずに NULL を返す場合があるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-21 17:53:12891ブラウズ

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

New() NULL 例外のスロー: コンパイラへの準拠

C 標準では、次の場合に new 演算子が std::bad_alloc 例外をスローすることが義務付けられています。メモリの割り当てに失敗します。ただし、一部のコンパイラ、特に VC6 の動作については、この標準に準拠していない可能性があるという懸念が提起されています。

VC6 の非準拠

の場合VC6 では、新しいオペレータがデフォルトで標準に従っていないことが確認されました。代わりに、失敗すると 0 (NULL) が返されました。この動作は、新しいステートメントのたびに NULL を明示的にチェックする必要があり、コードの見た目が美しくないため、開発者にとって課題となっていました。

Microsoft の対応と回避策

Microsoft は、これは問題であることを認めました。 -コンプライアンスを強化し、カスタムの新しいハンドラーを使用した回避策を提供しました。あるいは、開発者は、nothrownew.obj オブジェクト ファイルを利用して、新しい MSVC コンパイラ (7.0 以降) で VC6 の動作を模倣することもできます。

現在のコンプライアンス状態

幸いなことに、 MSVC 8.0 (VS2005) では、new のデフォルトの動作が標準に準拠するように修正され、メモリ割り当てが失敗した場合に std::bad_alloc 例外をスローするようになりました。 nothrownew.obj へのリンクは、元の VC6 のような動作を望む場合にのみ必要です。

手動 Null リターンのオプション

開発者は、新しい動作を行う必要があることを柔軟に指定できます。 std::nothrow を利用して例外をスローする代わりに 0 を返します。パラメータ:

SomeType *p = new(std::nothrow) SomeType;

この手法により、コンパイラ間で一貫したアプローチが可能になり、既存のエラー処理メカニズムを変更する必要がなくなるため、コードのメンテナンスが簡素化されます。

以上が「new」が例外をスローせずに NULL を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。