首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双重释放或内存损坏

双重释放或内存损坏
EN

Stack Overflow用户
提问于 2012-02-17 15:35:26
回答 3查看 677关注 0票数 0

我有一个这样的代码

代码语言:javascript
复制
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循环中。但我得到了

代码语言:javascript
复制
*** glibc detected *** ./test: double free or corruption (!prev): 0x13c13290 ***

但是如果我只在一个地方使用它,怎么能释放它两次呢?每次我使用它的时候,我都会释放它。我尝试使用addr2line查找之前释放它的位置,但得到的都是一个??:0

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-17 15:36:36

此行写入的内容超出缓冲区末尾一个字节。

代码语言:javascript
复制
verboseBuf[currSize + 1] = '\0';
票数 7
EN

Stack Overflow用户

发布于 2012-02-17 15:39:29

这条消息并不意味着你释放了两次东西,它意味着glibc检测到堆损坏,两次释放东西是导致这种情况的一个常见原因,但不是唯一的原因。

在本例中,这一行

代码语言:javascript
复制
verboseBuf[currSize + 1] = '\0';

正在溢出缓冲区的末尾,破坏分配器存储在它之后的任何记账数据。去掉+1,它就可以工作了。

票数 3
EN

Stack Overflow用户

发布于 2012-02-17 15:45:07

verboseBuf[currSize + 1] = '\0';设置为verboseBuf[currSize] = '\0';

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9324544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档