free(): invalid next size (fast):

最近在编写代码过程中遇到了一个问题,打印信息如题目所示:free(): invalid next size (fast): 0x0000000000aa4430。
查看生成的core文件的bt信息,显示如下:
#0  0x00007f4910cb35f7 in raise () from /lib64/libc.so.6
#1  0x00007f4910cb4ce8 in abort () from /lib64/libc.so.6
#2  0x00007f4910cf3317 in __libc_message () from /lib64/libc.so.6
#3  0x00007f4910cfafe1 in _int_free () from /lib64/libc.so.6
猜测是要free的指针已经free掉了或者是指针的指向已经被修改了。也可能是其他问题,就在网上查了一下出现这个问题还有的可能性
出问题的代码进行了简单截取,大致如下:
char print_rpmpkg(char *pcpkgname)
{
int iRet = 0;
ssize_t read = 0;
size_t len=0;
char *line=NULL;
FILE *fp= NULL;
char szCommand[128] = {0};

sprintf(szCommand, "rpm -ql %s", pcpkgname);

fp = popen(szCommand, "r");
if (fp == NULL)
return errno;

line= (char *)malloc(sizeof(char)*BUF_LEN);
if (line == NULL)
{
iRet = -1;
goto out;
}
printf("line ptr = %p\n", line);
while((read=getline(&line,&len,fp))!=-1)
{
line[read-1] = '\0';
printf(“%s\n”, line);
}
out:
if (line)
{
printf("line ptr = %p\n", line);
free(line);
line = NULL;
}
pclose(fp);

return iRet;
}
进行代码测试发现在经过getline函数之后,line指针的指向已经发生了变化,在进行free时free的指针并不指向原来申请的内存空间。解决办法是定义一个中间指针变量,将line赋值给中间变量,然后再将中间变量传递给getline作为第一个参数就不再由问题了。
char print_rpmpkg(char *pcpkgname)
{
int iRet = 0;
ssize_t read = 0;
size_t len=0;
FILE *fp = NULL;
char *line=NULL;
char *pcBuf = NULL;
char szCommand[128] = {0};

sprintf(szCommand, "rpm -ql %s", pcpkgname);

fp = popen(szCommand, "r");
if (fp == NULL)
return errno;

line= (char *)malloc(sizeof(char)*1024);
if (line == NULL)
{
iRet = -1;
goto out;
}
printf("line ptr = %p\n", line);
pcBuf = line;
while((read=getline(&pcBuf,&len,fp))!=-1)
{
pcBuf[read-1] = '\0';
printf(“%s\n”, pcBuf);
}
out:
if (line)
{
printf("line ptr = %p\n", line);
free(line);
line = NULL;
}
pclose(fp);

return iRet;
}
归根结底出现这个问题的原因是使用getline出现的问题,如果用户自己申请内存空间传递给getline,作为其第一个参数,他会修改第一个参数的指针指向,如果像我例子中使用,就会导致free(): invalid next size (fast): 0x0000000000aa4430问题;
我看到网上有些博客在使用getline时就有这个问题,请大家在使用getline时注意;
其次我在网上查了出现free(): invalid next size (fast): 0x0000000000aa4430这个问题的几种可能情况:
1.要free的对象被损坏了,可能其他地方出现了越界写;
2.free了已经被释放的内存指针,或者释放了没有内存没有申请成功的指针
3.指向free对象的指针不正确,像我的问题中一样,释放的指针不是malloc时返回的指针;

猜你喜欢

转载自blog.csdn.net/xufandecsdn/article/details/80759030