C++11 標準の関連部分: 5.3.4 [expr.new]
8- new 式は、割り当て関数 (3.7.4.1) を呼び出すことによって、オブジェクトのストレージを取得します。new- 式が例外をスローして終了する場合、解放関数 (3.7.4.2) を呼び出してストレージを解放することができます。割り当てられた型が非配列型の場合、割り当て関数の名前はoperator new
であり、割り当て解除関数の名前はoperator delete
です。割り当てられた型が配列型の場合、割り当て関数の名前はoperator new[]
であり、割り当て解除関数の名前はoperator delete[]
です。
18-上記のオブジェクト初期化のいずれかの部分が例外をスローして終了し、適切な割り当て解除関数が見つかった場合、割り当て解除関数が呼び出されて、オブジェクトが構築されていたメモリが解放され、その後、例外が伝播し続けます。 new-expression のコンテキストで。明確に一致する割り当て解除関数が見つからない場合、例外を伝播してもオブジェクトのメモリは解放されません。[ 注: これは、呼び出された割り当て関数がメモリを割り当てない場合に適しています。そうしないと、メモリ リークが発生する可能性があります。— エンドノート]
76) これには、new-initializer の評価および/またはコンストラクターの呼び出しが含まれる場合があります。
つまり、メモリは、コンパイラが適切な割り当て解除関数を見つけることができない非常に特殊な状況 (たとえば、カスタム (デ) アロケータを台無しにしたか、メモリを実際に解放する必要がない場合) を除いて、自動的に解放されます。 )。