ホームページ >バックエンド開発 >C++ >C では「new」は常に「std::bad_alloc」をスローしますか?

C では「new」は常に「std::bad_alloc」をスローしますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 08:50:03648ブラウズ

Does `new` Always Throw `std::bad_alloc` in C  ?

真の例外: C メモリ管理の標準を超えている

C 標準に反して、次のような一部のコンパイラでは、 VC6、new の割り当てに失敗した場合に std::bad_alloc 例外を返すという予期された動作から逸脱します。 Memory.

通常、new が要求されたメモリの取得に失敗すると、確立された C 標準に従って std::bad_alloc 例外がトリガーされます。ただし、VC6 の場合は、別のアプローチが採用されました。

VC6 は、メモリ割り当ての失敗時に例外を返す代わりに 0 (または NULL) を返したと報告されています。この動作は標準とは異なり、コード内で混乱や予期せぬ結果が生じる可能性があります。

この問題に対処するために、Microsoft は推奨される解決策としてカスタムの新しいハンドラーを導入しました。ただし、Visual C 7.0 および 7.1 (VS2002 および VS2003) では、複雑なルールのセットによって、new が非スロー方式で動作するかスロー方式で動作するかが決定されました。

Visual C 8.0 (VS2005) のリリースでは、 Microsoft は一貫したポリシーを適用することで問題を解決しました。このバージョンでは、nothrownew.obj オブジェクト ファイルと明示的にリンクされていない限り、new は常にデフォルトで例外をスローします。

VC6 用に設計された古いコードを使用する開発者の場合、std::nothrow パラメータを利用して次のことができます。そのコンパイラで new の動作を模倣します。 new(std::nothrow) を指定すると、コードを機械的に変更して、さまざまなコンパイラ間で同様に機能するようにできるため、既存のエラー処理メカニズムを徹底的に見直す必要がなくなります。

以上がC では「new」は常に「std::bad_alloc」をスローしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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