【问题标题】:C++ calling destructors doesnt realy delete objects from memory [closed]C ++调用析构函数并没有真正从内存中删除对象[关闭]
【发布时间】:2014-06-20 10:47:19
【问题描述】:

我是 C++ 的新手,我正在开发应用程序,我通过使用 new 关键字(如 MyObject* obj = new Object())在内存中分配大量对象。在对它们进行一些操作之后(稍后的一些代码行),我正在调用像delete obj 这样的析构函数。但是经过多次迭代,我注意到内存消耗很大,显然这些对象没有被破坏。所以我尝试了简单的例子:

Algorhitm* alg;
for (int o = 0; o < 500000000; o++)
{
    alg = new Algorhitm();
    alg->~Algorhitm();
}

还有delete alg,但似乎没有释放内存。内存消耗增加到临界点,然后导致我的应用程序崩溃。有人可以向我解释一下,我做错了什么吗?我使用了名为 C++ Memory Validator 的内存分析工具,在一些内存分配和解除分配图表的部分中,只有分配,但该工具无法识别解除分配。

【问题讨论】:

  • 您是否有好的理由首先使用动态内存?
  • Algorhitm 类有哪些成员?如果它有任何指针,您必须编写自己的析构函数来释放它们。默认析构函数不会“释放”它们。此外,通常您应该坚持使用delete,而不是手动调用析构函数。
  • 请提供complete, minimal program 展示该程序。您可能做错了六件基本的事情,虽然每个问题都有很好的答案,但我们首先需要找出我们正在处理的情况。
  • alg-&gt;~Algorithm(); 调用析构函数,但它不会释放内存。你必须使用delete alg; 来释放内存。
  • @πάνταῥεῖ:好吧,你声称这是未定义的行为也是错误的。这是内存泄漏。使用内存仍然是允许的,但如果没有指向它的指针,就没有办法这样做。

标签: c++ memory memory-management destructor


【解决方案1】:

绝不应该直接使用~&lt;destructor&gt; 函数调用析构函数!你应该打电话

delete alg;

或者依赖被调用的析构函数和分配的内存被释放,因为你的类的堆栈分配实例超出了范围。

析构函数的直接调用对内存管理完全没有影响,而且在大多数情况下是错误的(很少需要自定义delete实现)。

释放之前分配的内存。
尽管您可能会看到数据结构仍然存在。在delete 之后访问这些,无论如何都会导致未定义的行为!

【讨论】:

    【解决方案2】:

    我同意。调用析构函数并不会真正释放内存,除非析构函数调用 delete 或 free()。

    然而,调用 delete 或 free() 确实会释放内存,但会释放回堆,而不是释放到操作系统。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 2021-04-10
      • 2013-09-30
      • 2017-07-06
      • 1970-01-01
      • 2013-10-04
      • 2019-10-08
      • 2014-12-27
      • 2013-05-21
      相关资源
      最近更新 更多