/Zc: throwingNew (new 演算子のスローの仮定)

/Zc:throwingNew オプションが指定されている場合、コンパイラは operator new への呼び出しを最適化して、null ポインターの戻り値のチェックをスキップします。 このオプションは、operator new とカスタム アロケーターのすべてのリンク済み実装が C++ 標準に準拠しており、割り当てエラーの発生時に例外をスローするものと想定するように、コンパイラに指示します。 Visual Studio の既定では、コンパイラはこれらの呼び出しに対して null チェック (/Zc:throwingNew-) を悲観的に生成します。これは、ユーザーが operator new の非スロー実装とリンクしたり、null ポインターを返すカスタム アロケーター ルーチンを記述したりする可能性があるためです。

構文

/Zc:throwingNew[-]

解説

ISO C++98 以降の標準では、メモリ割り当てが失敗した場合、既定の operator new によって std::bad_alloc がスローされます。 Visual C++ 6.0 までの Visual C++ のバージョンでは、割り当てエラー時に null ポインターが返されました。 Visual Studio 2002 以降では、operator new は標準に準拠し、失敗時に例外をスローします。 以前の割り当てスタイルを使用するコードをサポートするために、Visual Studio では、エラー時に null ポインターを返す nothrownew.obj で、operator new のリンク可能な実装が提供されます。 既定では、このような古いスタイルのアロケーターが障害時に直ちにクラッシュするのを防ぐために、コンパイラによって防御的な null チェックも生成されます。 /Zc:throwingNew オプションは、すべてのリンクされたメモリ アロケーターが標準に準拠しているという前提のもとに、これらの null チェックを省略するようコンパイラに指示します。 これは、非スローの operator new オーバーロードには適用されません。これらは、std::nothrow_t 型の追加パラメーターを使用して宣言され、noexcept が明示的に指定されます。

理論上、空きストアにオブジェクトを作成する際には、そのメモリを割り当て、コンストラクターを呼び出してメモリを初期化するためのコードがコンパイラによって生成されます。 MSVC コンパイラでは、通常、このコードが非準拠の非スロー アロケーターにリンクされるかどうかを確認することができないため、既定では、コンストラクターを呼び出す前に null チェックも生成されます。 これにより、非スローの割り当てが失敗した場合に、コンストラクター呼び出しでの null ポインターの逆参照が防止されます。 ほとんどの場合、これらのチェックは不要です。既定の operator new アロケーターは、null ポインターを返す代わりに例外をスローするからです。 また、これらのチェックには残念な副作用もあります。 コード サイズが大きくなったり、分岐予測子が増えすぎたりするほか、初期化されたオブジェクトで、仮想化や定数伝達などの便利なコンパイラ最適化を利用できなくなります。 これらのチェックは、nothrownew.obj にリンクするコードや、カスタムによる非準拠の operator new 実装を含んだコードをサポートするためにのみ存在します。 非準拠の operator new を使用しない場合には、/Zc:throwingNew を使用してコードを最適化することをお勧めします。

/Zc:throwingNew オプションは既定ではオフであり、/permissive- オプションによる影響は受けません。

リンク時コード生成 (LTCG) を使用してコンパイルする場合は、/Zc:throwingNew を指定する必要はありません。 LTCG を使用してコードがコンパイルされる場合、コンパイラは、既定である標準準拠の operator new 実装が使用されているかどうかを検出することができます。 その場合、コンパイラは null チェックを自動的に省略します。 リンカーは、/ThrowingNew フラグを検索して、operator new の実装が標準に準拠しているかどうかを確認します。 カスタム演算子の新規実装のソースにこのディレクティブを含めれば、リンカーに対してこのフラグを指定することができます。

#pragma comment(linker, "/ThrowingNew")

Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成] ドロップ ダウン メニューで、[すべての構成] を選択します。

  3. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  4. /Zc:throwingNew または /Zc:throwingNew- が含まれるように [追加オプション] プロパティを変更し、[OK] をクリックします。

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文
/Zc (準拠)
noexcept (C++)
例外の仕様 (スロー) (C++)
terminate (例外)