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 的任何删除运算符。e 没有解除分配?

谢谢,

4

4 回答 4

5

您可能在这里遗漏的关键见解是它与特定变量delete没有任何关系- 它与存储在某个内存地址的特定对象有关系。通常情况下,“任何分配的对象都必须用 释放”。但请注意对象一词的使用- 不是变量。newdelete

考虑:

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

在这个例子中,我们删除b了 ,它指向Fraction第一行分配的对象。我们也可以 delete a,它指向同一个Fraction对象。只要我们删除分配的每个对象new(无论我们使用哪个指针变量来访问该对象),就不会发生内存泄漏。另请注意,如果我们同时删除两者 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 回答
1

你应该删除 (c or f) & e

于 2013-04-22T11:11:35.637 回答