2

メモリ割り当ての失敗を処理するために set_new_handler (std::new_handler handle_mem_alloc) を使用し、メモリ割り当ての失敗が発生した場合は常に、handle_mem_alloc () が呼び出されます。この関数内から例外をスローしない場合、 new 演算子はエラーをスローしません。

私の質問は、メモリ割り当てに失敗し、handle_mem_alloc() 関数から例外をスローしていないときに、このシナリオでコンストラクターが呼び出されるかどうかです。

4

1 に答える 1

4

この参照から、新しいハンドラーは次のいずれかを実行する必要があります。

  1. より多くのメモリを利用可能にする
  2. プログラムを終了します (たとえば、std::terminate を呼び出して)
  3. タイプ std::bad_alloc または std::bad_alloc から派生した例外をスローします。

新しいハンドラーが戻ると、割り当てが再試行され、それでも失敗する場合は、新しいハンドラー (キャッシュされておらず、新しいハンドラーによって変更される可能性があります) が再度呼び出されます。

したがって、あなたの質問に対する答えはノーです。メモリ割り当てが実際に成功するまで、コンストラクターは呼び出されません。

于 2013-10-02T10:40:39.103 に答える