运行程序时,以下deleteNode函数得到以下结果: *检测到glibcfree():下一个大小无效(正常):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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我使用并理解valgring然后问题是我的主要功能.我也有一些'免费'但我在此消息之前更改了deleteNode所以我认为问题出在deleteNode函数上.
现在,天下没有免费的()无效的下一个大小....但遗憾的是这样的: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);
}
Run Code Online (Sandbox Code Playgroud)
调试它...
多重定义main'
pro:(.text+0xce0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtend.o:(.dtors+0x0): multiple definition ofDTOR_END."亲:( dtors + 0x8中):首先这里定义的/ usr/bin中/ LD:警告:无法创建.eh_frame_hdr部分,--eh帧-HDR忽略./ usr/bin/ld:pro1中的错误(.eh_frame); 不会创建.eh_frame_hdr表.collect2:ld返回1退出状态
"无效的下一个大小"意味着glibc已经检测到内存领域的损坏.
您已覆盖存储在已分配块之间的有价值的会计信息.
对于malloc您提供的每个块,附近存储了一些会计信息.例如,当您通过将128个字符写入20个字符的缓冲区来覆盖此信息时,glibc可能会在您下次尝试释放(或可能分配)某些内存时检测到此信息.
你需要找到这个问题的根本原因 - 这不是免费本身,而是正是在检测问题的地方.在某些地方,你的一些代码会破坏内存,像valgrind这样的内存分析工具在这里是非常宝贵的.