我有一个这样的代码
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。
发布于 2012-02-17 15:36:36
此行写入的内容超出缓冲区末尾一个字节。
verboseBuf[currSize + 1] = '\0';发布于 2012-02-17 15:39:29
这条消息并不意味着你释放了两次东西,它意味着glibc检测到堆损坏,两次释放东西是导致这种情况的一个常见原因,但不是唯一的原因。
在本例中,这一行
verboseBuf[currSize + 1] = '\0';正在溢出缓冲区的末尾,破坏分配器存储在它之后的任何记账数据。去掉+1,它就可以工作了。
发布于 2012-02-17 15:45:07
将verboseBuf[currSize + 1] = '\0';设置为verboseBuf[currSize] = '\0';
https://stackoverflow.com/questions/9324544
复制相似问题