gpt4 book ai didi

c - *glibc 检测到双重释放或损坏 () * 消息!

转载 作者:行者123 更新时间:2023-12-01 06:16:13 28 4
gpt4 key购买 nike

当我运行程序时,下面的 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() invalid next size....但不幸的是:检测到 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): 首先在这里定义
/usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtend.o:(.dtors+0x0): 多重定义
DTOR_END'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 检测到您的内存空间损坏。

您已经覆盖了存储在您分配的 block 之间的有值(value)的会计信息。

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

您需要找到此问题的根本原因 - 不是免费本身,而是检测到问题的地方。在某个地方,您的某些代码正在破坏内存,而像 valgrind 这样的内存分析工具在这里将非常有用。

关于c - *glibc 检测到双重释放或损坏 () * 消息!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com