调用空闲 block

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

在调试我的代码时,我发现我的程序在清理过程中经常崩溃。通过添加一些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. 对同一个 block 多次调用 free。
  2. 使用未使用 malloc() 等分配的 block 调用 free。
  3. 使用已损坏的 block 调用 free。

您所描述的随机行为是此类问题的典型特征。

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

关于调用空闲 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36828825/

相关文章:

c - 嵌套 for 循环的问题

java - Tomcat 线程就绪

c - 杀死僵尸进程,了解linux C中的PID

c - "Pulling down"将二维数组的元素移动到数组内的空白处

c - 为什么 C 不创建我的链表头?

c# - 在 C# 中显式释放内存

c++ - 从 C++ 代码中的 C 回调诊断内存损坏

c# - 64位进程的进程内存限制

c - 为什么我的模块无法处理内核分页请求?

c++ - 将我的字符保留在范围内并进行处理