【问题标题】:new and delete Memory Management out of scopenew 和 delete 内存管理超出范围
【发布时间】:2013-04-22 11:06:57
【问题描述】:
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 没有解除分配?

谢谢,

【问题讨论】:

  • delete 不会删除变量。它删除指针变量指向的分配内存。
  • 您有两个news 和一个delete。你泄露了一个Fraction
  • 我猜第三行是不可能的。您正在使用(非常量)指针指向一个 const 对象。
  • 一个更重要的问题:为什么要动态分配Fraction,而它显然支持复制和分配?
  • 是的,那是我的错误。我试图找出哪些值被删除,哪些对象也被删除。谢谢!

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


【解决方案1】:

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

考虑:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但他也可以轻松删除ef。 (其实他已经删除了f。)
    【解决方案3】:
    1. 您将删除使用new Fraction(3, 4); 创建的对象
    2. 是的e 或更严格地说,使用new Fraction(7, 8); 分配的内存不会被释放,从而导致内存泄漏。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-11
        • 2013-04-03
        • 2014-03-26
        • 2021-12-11
        • 1970-01-01
        • 2020-08-18
        • 2021-04-15
        • 2022-01-13
        • 2013-04-16
        相关资源
        最近更新 更多