3

構築中にクラスが例外をスローすると、割り当てられたメモリはどうなりますか?また、このようなことをどのように処理しますか? 例えば:

std::auto_ptr<ThirdPartyClass> au_tpc;

try
{
    au_tpc.reset(new ThirdPartyClass());
}
catch(...)
{
    // What happened to the memory allocated of 
    // sizeof(ThirdPartyClass) for the new instance?
}
4

4 に答える 4

7

それだけで機能します。メモリは、例外処理ブロックが実行される前に解放されます。

于 2013-07-30T12:36:27.150 に答える
3

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 の評価および/またはコンストラクターの呼び出しが含まれる場合があります。

つまり、メモリは、コンパイラが適切な割り当て解除関数を見つけることができない非常に特殊な状況 (たとえば、カスタム (デ) アロケータを台無しにしたか、メモリを実際に解放する必要がない場合) を除いて、自動的に解放されます。 )。

于 2013-07-30T13:20:57.797 に答える
-2

構築中にクラスが例外をスローすると、割り当てられたメモリはどうなりますか?また、このようなものをどのように処理しますか?

これは良い質問であり、正しい扱いには本格的な記事が必要です。グッド ニュースは、誰かがすでにその記事を書いています: Constructor Failuresです。

于 2013-07-30T13:26:41.737 に答える