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

运行程序时,以下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然后问题是我的主要function。 我也有一些’免费’但我在此消息之前更改了deleteNode所以我认为问题出在deleteNode函数上。

现在,没有free()无效的下一个大小….但不幸的是:glibc检测到*:double free或者腐败(out):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 ‘ pro :(。dtors + 0x8):首先在这里定义/ usr / bin / ld:警告:无法创建.eh_frame_hdr部分, – eh-frame-hdr被忽略。 / usr / bin / ld:pro1中的错误(.eh_frame); 不会创建.eh_frame_hdr表。 collect2:ld返回1退出状态

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

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

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

你需要找到这个问题的根本原因 – 它不是免费本身,而是正是在检测问题的地方。 在某些地方,你的一些代码是无用的内存,像valgrind这样的内存分析工具在这里是非常宝贵的。

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

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

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