2

C++ FAQから失敗したコンストラクターを読んでいますが、次のコードがわかりません。

void f()
{
  X x;             ← if X::X() throws, the memory for x itself will not leak
  Y* p = new Y();  ← if Y::Y() throws, the memory for *p itself will not leak
}

コンストラクターがスローした場合、 p が指すメモリがリークしない可能性はありますか? シーケンスは次のとおりであると仮定しました。

  1. オブジェクト Y にメモリが割り当てられます。
  2. Y のコンストラクターが呼び出されます。
  3. Y のコンストラクターがスローされ、p が指すメモリがリークします。
4

4 に答える 4

2

Y のコンストラクターがスローすると、Y に割り当てられたメモリの削除を含め、スタックがアンワインドされます。

問題は主に、処理するオブジェクトが複数ある場合に発生します。例えば:

void f() { 
    X *x = new X();
    Y *y = new Y();
}

ここで、new X()パーツが成功してもnew Y()パーツが失敗した場合、割り当てられたメモリはy削除されますが x破棄されず、そのメモリがリークされます。あなたが本当に主張するなら、ブロックでこの問題を回避することができます:try

try { 
    X *x = new X();

    Y * y = new Y();
}
catch (y_construction_failed) {
    delete x;
}

これの大きな問題はtry、2 つ以上のアイテムがある場合、ブロックをネストする必要があることです。そのため、たとえば半ダースのローカル変数が必要な場合、ネストが深くなり、耐え難いほど醜くなります。

于 2013-11-12T16:28:19.430 に答える