新建和删除内存管理超出范围

时间:2013-04-22 11:06:58

标签: c++ memory-management memory-leaks new-operator

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没有取消分配?

  3. 谢谢,

4 个答案:

答案 0 :(得分:5)

您可能在这里遗漏的关键见解是delete与特定的变量没有任何关系 - 它与特定的对象有关系存储在某个内存地址。通常会将“使用new分配的任何对象都必须与delete取消分配”。但请注意使用 object 这个词 - 不是变量。

考虑:

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

在此示例中,我们删除了b,它指向第一行分配的Fraction对象。我们也可以删除a,它指向同一个Fraction对象。只要我们删除用new分配的每个 对象 (无论我们使用哪个指针变量来访问对象),都没有内存泄漏。另请注意,如果我们删除 ab,那么我们就会出现错误(通过double-delete进行未定义的行为)。

答案 1 :(得分:4)

您应该删除c(或f),但不能同时删除两者,您应该删除e。每个new应为delete

答案 2 :(得分:1)

  1. 您将删除使用new Fraction(3, 4);
  2. 创建的对象
  3. e或更严格地说,分配有new Fraction(7, 8);的内存不会被解除分配,导致内存泄漏。

答案 3 :(得分:1)

你应该删除(c或f)& ë