* glibc检测到双重免费或腐败()*消息!

时间:2010-10-31 14:56:14

标签: c free

运行程序时,以下deleteNode函数获取以下内容: 检测到 * glibc free():下一个尺寸无效(正常):0x000000000103dd90 * *

即使我做'自由(这里); '评论,我收到上述消息。 我不认为其他“免费”电话会引发这样的问题。但我不明白为什么这会是错的。 :/

struct List *deleteNode(int Code,int i,char* Number)
    {
        struct List *here;
        here=Head;

        for (here; here!=Tail; here=here->next)
        {       
            if ( (here->number==Number) && (here->code==Code) )//found node on the List
            {
                if (here->previous==Head)        //delete from beginning
                {           
                    Head=here->next;
                    here->next->previous=Head;
                }
                else if (here->next==Tail) //delete from the end
                {
                    here->previous->next=Tail;
                    Tail=here->previous;
                }
                else  //delete from the middle of the list
                {   
                    here->previous->next=here->next;
                    here->next->previous=here->previous;
                }
                break;
            }
        }

        free (here);

    }

编辑: 如果我使用并理解valgring然后问题是我的主要功能。 我也有一些'免费',但我在此消息之前更改了deleteNode,所以我认为问题出在deleteNode函数上。

现在,没有free()无效的下一个尺寸....但遗憾的是: glibc检测到 *:双重免费或损坏(输出):0x00007fff1aae9ae0 * :(

主要部分:

FILE *File;
    if ( ( File=fopen("File.txt","r")) !=NULL )
    {                               
        int li = 0;    
        char *lin = (char *) malloc(MAX_LINE * sizeof(char));


        while(fgets(lin, MAX_LINE, eventFile) != NULL)
        {
            token = linetok(lin, " ");

            if(token != NULL)
            {

                int i,code,nodeID;
            char *number;
            char *event;

                for(i = 0; token[i] != NULL; i += 1)
                {
            code=atoi(token[0]);
            strcpy(event,token[1]);
            nodeID=atoi(token[2]);
            strcpy(number,token[3]) ;

            int i;
            if (!strcmp(event,"add"))
            {       
                add_to_List(code,i,number);
            }
            else if(!strcmp(event,"delete"))
            {       
                             deleteNode(eventNo,i,number);
                    }
            free(event);
            free(phoneNumber);  
        }
                free(token);
            }
            else 
            {
                printf("Error reading line %s\n", lin);
                exit(1);   
            }
        }
    } 
    else 
    {
        printf("Error opening file with the events.\nEXIT!");
        exit(0);
    }

调试它......

main' pro:(.text+0xce0): first defined here /usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtend.o:(.dtors+0x0): multiple definition of DTOR_END 的多重定义 亲:(。dtors + 0x8):首先在这里定义 / usr / bin / ld:警告:无法创建.eh_frame_hdr部分, - eh-frame-hdr被忽略。 / usr / bin / ld:pro1中的错误(.eh_frame);不会创建.eh_frame_hdr表。 collect2:ld返回1退出状态

2 个答案:

答案 0 :(得分:5)

“无效的下一个大小”意味着glibc已经检测到内存领域的损坏。

您已覆盖存储在已分配区块之间的有价值的会计信息。

对于malloc给你的每个块,附近存储了一些会计信息。例如,当您通过将128个字符写入20个字符的缓冲区来覆盖此信息时,glibc可能会在您下次尝试释放(或可能分配)某些内存时检测到此信息。

你需要找到这个问题的根本原因 - 这不是免费本身,只是问题被检测到的地方。在某些地方,你的一些代码会破坏内存,像valgrind这样的内存分析工具在这里会非常宝贵。

答案 1 :(得分:2)

如果在列表中找不到该节点,您将释放该函数末尾的Tail节点,而不更新Tail以指向任何有效的节点。

进一步使用列表和现在解除分配的Tail很容易导致内存损坏,以后可能会被glibc检测到一条消息,就像你得到的那样。

另请注意,在(here->number==Number)中,您要比较两个指针,而不是指针指向的值。我不确定这是不是你想要的。