天天看点

malloc后free出错 (释放了错误的地址空间)问题原因分析解决方法

malloc后free出错

  • 问题
  • 原因分析
  • 解决方法

问题

程序malloc后,free时 core dump

源程序如下(举例):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    buf = (int *)malloc(sizeof(int));
    buf++;
    free(buf);
    return 0;
}

           

出错信息如下:

malloc后free出错 (释放了错误的地址空间)问题原因分析解决方法

原因分析

指针 buf 的地址在 malloc 之后地址被改变,导致 free 时 free的不是以前的空间,因此出错。

上面举例很简单,意图也很明显,buf++ 就是为了说明 buff 地址被改变。

我们日常编程中遇到的问题肯定不会这么明显,但是程序中很可能就出现了类似的错误。比如在取地址时为了取到后面数据,对地址进行了改变。因此才会出现上述错误。

这种问题只需要 free 正确的地址就可。

解决方法

程序修改如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    int *buf_src = NULL;
    buf = (int *)malloc(sizeof(int));
    buf_src = buf;
    buf++;
    free(buf_src);
    return 0;
}

           

增加一个指针变量 buf_src,用于保存原指针 buf 的地址,

现在 free(buf_src),既是对 malloc 时 指针 buf 地址空间的释放。

继续阅读