调用空闲块

Call to free blocks

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

#define'd free, calloc, mallocrealloc, 把它们放在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

编译

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

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

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

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