打电话给免费区块

时间:2016-04-24 20:59:22

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

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

#define&#39; 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进行编译

1 个答案:

答案 0 :(得分:1)

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

  1. 对同一个区块多次免费调用。
  2. 使用未使用malloc()&amp;分配的块调用释放有限公司
  3. 使用已损坏的块自由调用。
  4. 您描述的此类问题的典型随机行为。

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