【问题标题】:Call to free blocks调用释放块
【发布时间】:2016-08-18 03:36:55
【问题描述】:

在调试我的代码时,我发现我的程序在清理过程中经常崩溃。通过添加一些printf 语句,我很快发现程序在调用free 时不断崩溃(那里有多个,但它总是会在其中一个上崩溃)。

#define'd freecallocmallocrealloc,把它们放在 config.h 中,让他们打印出他们在哪里做的事情,+ 代表 malloc<>realloc-free

这些是结果:

+ 00a92570
< 00a92570
> 00a93980
< 00a93980
> 00a93980
< 00a93980
> 00a94988
< 00a94988
> 00a96990
< 00a96990
> 00950048
+ 00a92570
+ 00958050
+ 00958458
- 00958458

再次运行,程序几乎完成,但在最后一行失败:

+ 00ac2570
< 00ac2570
> 00ac3980
< 00ac3980
> 00ac3980
< 00ac3980
> 00ac4988
< 00ac4988
> 00ac6990
< 00ac6990
> 00960048
+ 00ac2570
+ 00968050
+ 00968458
- 00968458
- 00968050
- 00ac2570
- 00960048

这些都是对我的字符串库的调用。首先,您会看到我的程序加载到一个文本文件中,然后您会看到它为我要解析的标记分配缓冲区(假设它是姓名、年龄、地址)。处理完文件后,清理过程开始。困扰我的是,free 显然是在一个有效指针上运行的,那么它为什么会崩溃呢? free 在传递有效指针时会崩溃吗?我在 Windows 10 上并使用 gcc 4.9.3 进行编译

【问题讨论】:

  • 但它是一个有效的指针吗?如果你 realloc 某事,你必须确保 no 其他指针指向旧内存块。
  • 是时候加载你的调试器了。
  • @StoryTeller 你到底是什么意思?我做void* old = ptr; ptr = realloc(ptr, size); if (ptr == NULL) { ptr = old; return 1; } return 0;
  • @YoYoYonnY 您可能会惊讶地发现 Windows 开发系统也有调试器。您如何看待 Windows 开发人员。有什么工作吗?
  • @MartinJames:这是一个技巧问题吗? :(

标签: c memory memory-management memory-leaks heap-memory


【解决方案1】:

如果你在 free() 上崩溃,可能的原因是:

  1. 为同一个区块多次调用 free。
  2. 使用未使用 malloc() & Co. 分配的块调用 free。
  3. 使用已损坏的块进行免费调用。

你描述的随机行为是这类问题的典型。

您最好尝试使用调试 malloc/free 实现。

【讨论】:

  • 内存块究竟是如何损坏的?我写了一个超出边界的内存缓冲区,这算作损坏吗?
  • 是的,就是这样。在块之前扶正通常是它发生的方式。但是,当您从一个块写入另一个块时,也会发生这种情况。
猜你喜欢
  • 2011-09-01
  • 2012-05-03
  • 2021-12-09
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多