我有这样的代码
char *verboseBuf = NULL;
if(somethin){
for(a loop){
for(another loop){
if(somethin else){
if(curl execution){
if(fail){
verboseBuf = (char *) malloc(sizeof(char) * (currSize +1));
fread(verboseBuf, 1, currSize, verboseFd);
verboseBuf[currSize + 1] = '\0';
string verbose = verboseBuf;
free(verboseBuf);
}
}
}
}
}
}
我使用verboseBuf的唯一地方是在最终的if循环中。但是我得到了
*** glibc detected *** ./test: double free or corruption (!prev): 0x13c13290 ***
但如果我只在一个地方使用它,怎么可以释放它两次呢?每次我使用它,我都会释放它。
我尝试使用addr2line来找到之前被释放的地方,但所有得到的都是??:0
。
答案 0 :(得分:7)
此行在缓冲区末尾写入一个字节。
verboseBuf[currSize + 1] = '\0';
答案 1 :(得分:3)
该消息并不意味着您释放了两次,这意味着glibc检测到堆损坏,并且释放两次是一个的常见原因,但不是唯一的。
在这种情况下,行
verboseBuf[currSize + 1] = '\0';
溢出缓冲区的末尾,破坏了分配器后存储的任何簿记数据。删除+1,它应该工作。
答案 2 :(得分:0)
将verboseBuf[currSize + 1] = '\0';
设为verboseBuf[currSize] = '\0';