1
void f(const Fraction& a)
{ Fraction b = a;
  Fraction* c = new Fraction(3, 4);
  Fraction* d = &a;
  Fraction* e = new Fraction(7, 8);
  Fraction* f = c;
  delete f;
 }
  1. どの値を削除しますか? 動的に割り当てられた c のみを削除し、関数が終了すると残りのオブジェクトは自動的に破棄されると思います。

  2. エはどうですか?これも動的に割り当てられますが、e の削除演算子はありません。e の割り当てが解除されていませんか?

ありがとう、

4

4 に答える 4

5

ここでおそらく見逃している重要な洞察は、特定の変数deleteとの関係がないことです。特定のメモリ アドレスに格納されている特定のオブジェクトとの関係があります。「 で割り当てられたオブジェクトは、で割り当てを解除する必要がある」という規則が一般的に述べられています。ただし、変数ではなく、オブジェクトという言葉の使用に注意してください。newdelete

検討:

Fraction* a = new Fraction(3,4);
Fraction* b = a;
delete b;

この例では、最初の行に割り当てられbたオブジェクトを指すを削除しました。同じオブジェクトを指す をFraction削除することもできました。割り当てられたすべてのオブジェクトを削除する限り(オブジェクトへのアクセスに使用するポインター変数に関係なく)、メモリ リークは発生しません。また、両方を削除するとエラーが発生することにも注意してください ( double-deleteによる未定義の動作)。aFractionnew ab

于 2013-04-22T11:14:08.350 に答える
4

c(または)を削除するf必要がありますが、両方を削除する必要はありませんe。それぞれnewが である必要がありますdelete

于 2013-04-22T11:09:09.833 に答える
1
  1. で作成したオブジェクトを削除しますnew Fraction(3, 4);
  2. はいe、またはより厳密に言えば、割り当てられたメモリnew Fraction(7, 8); は割り当て解除されず、メモリリークが発生します。
于 2013-04-22T11:08:19.353 に答える