【问题标题】:Can a corrupted heap be cleaned up?可以清理损坏的堆吗?
【发布时间】:2019-07-25 03:58:46
【问题描述】:

如果我损坏了我的堆,我可以在之后清理它吗?如果是,怎么做?

堆损坏示例:

int *x = new int; // If we allocate memory wit new, we have to free it later.. 
x++;
*x = 1; // the heap is now corrupted

但是,调用free(x)delete x 等会导致上面的代码崩溃。内存是否仍会以某种方式被释放,或者它是否已经超出了希望?

【问题讨论】:

  • 它被摧毁了。走了。重新开始,不要再做这些事情了。
  • 一般不会,一旦你的内存被破坏了,就真的没有办法恢复到之前的状态了。

标签: c++ memory-management memory-leaks free delete-operator


【解决方案1】:

如果我损坏了我的堆,我可以在之后清理它吗?

不,您无法解决此问题。基本上你的程序有未定义的行为堆损坏是一些清理工具在调试模式下运行您的代码时检测到的。

无法撤消 *x = 1; 或恢复之前存在的值。


但是,调用 free(x)、delete x 等会导致上面的代码崩溃。

当然,你正在尝试释放你从未分配过的东西。

内存是否仍会以某种方式被释放,或者它是否已经超出了希望?

它已经破灭了。

【讨论】:

  • 感谢您的快速回复。我稍后会接受你的回答。
  • 但我认为分配了一些东西 - x 实际上的大小为 8。它应该只有 4 的大小。它现在崩溃了,因为它期望大小为 4 还是因为地址第二个整数之前没有标记为分配的内存?
  • @Imago new 通常会在后台分配更大的块,但是您的代码有未定义的行为,并且不允许您依赖此类实现细节。跨度>
  • 我明白了:/,我只是想更好地理解指针的概念。我阅读了指针并想知道会发生什么......大多数教程似乎没有详细介绍它......
猜你喜欢
  • 2011-09-29
  • 2010-09-17
  • 1970-01-01
  • 2010-11-15
  • 2015-03-04
  • 2016-07-18
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多