Will New Ever Return NULL?
C では、 new 演算子は新しいオブジェクトにメモリを割り当てる責任があります。 C 標準によれば、 new がメモリの割り当てに失敗した場合、 std::bad_alloc 例外がスローされることが予想されます。ただし、Visual C 6 (VC6) などの特定のコンパイラがこの動作から逸脱しているという噂があります。
VC6 の非準拠
噂は本当です。 。 VC6 は、デフォルトでは、この点に関して C 標準に準拠していませんでした。 new がメモリの割り当てに失敗すると、例外をスローする代わりに 0 (または NULL) を返しました。
Microsoft の回避策
Microsoft はこの問題を認識し、推奨される回避策を提供しました。カスタムの新しいハンドラーを使用します。開発者は、0 を返す代わりに std::bad_alloc 例外をスローする演算子 new の独自の実装を指定できます。
以降の MSVC コンパイラー
以降のバージョンの MSVC ( 7.0 以降)、new の動作はより複雑になりました。例外をスローするか 0 を返すかを決定する一連のルールがありました。
VS2005 以降
VS2005 (MSVC 8.0) で、Microsoft は最終的にクリーンアップしました。この行動。デフォルトでは、nothrownew.obj に明示的にリンクされていない限り、new は std::bad_alloc 例外をスローするようになりました。
代替アプローチ: std::nothrow
開発者はそれを指定することもできます。 std::nothrow パラメータを使用して例外をスローするのではなく、new が 0 を返すようにしたいと考えています。これにより、VC6 用に作成された従来のコードであっても、コンパイラ間で一貫した動作が可能になります。
以上がさまざまな C コンパイラにおける「新しい」演算子の動作、特にメモリ割り当ての失敗に関してはどのようなものですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。