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