ホームページ >バックエンド開発 >C++ >さまざまな C コンパイラにおける「新しい」演算子の動作、特にメモリ割り当ての失敗に関してはどのようなものですか?

さまざまな C コンパイラにおける「新しい」演算子の動作、特にメモリ割り当ての失敗に関してはどのようなものですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 20:14:02596ブラウズ

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

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 サイトの他の関連記事を参照してください。

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