gpt4 book ai didi

c - free() 错误(使用 valgrind 调试)?

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:49 25 4
gpt4 key购买 nike

我有这些结构:

typedef struct _Frag{
struct _Frag *next;
char *seq;
int x1;
int length;
}Frag;

typedef struct _Fragment{
int type;
Frag *frag_list;
}Fragment;

然后我创建了一个数组

Fragment *fragments=malloc(1,sizeof(Fragment)); // or more
fragments->frag_list=malloc(1,sizeof(Frag)); // or more
Frag *frag=malloc(10,sizeof(Frag));
frag->seq="test str\n";
...
frag->next=malloc(1,sizeof(Frag));
frag->next->seq="test str\n";

在程序结束时,我想释放内存,函数是:

static void free_frags(){
int i;
Fragment *fragment;
Frag *current,*next;
for(i=0;i<1;i++){
fragment=&snp_frags[i];
current=fragment->frag_list;
next=current->next;

while(next!=NULL){
free(current->seq);
//free(current->next);
free(current);
current=next;
next=current->next;
}
free(current->seq);
//free(current->next);
free(current);
//free(fragment->frag_list);
free(&snp_frags[i]);
}
free(snp_frags);
}

如果我使用 valgrind 调试它,valgrind 会说:

=============================================
==3810== Invalid read of size 4
==3810== at 0x80490FD: free_snp (hap.c:16)
==3810== by 0x80493AF: main (hap.c:73)
==3810== Address 0x41b139c is 12 bytes inside a block of size 296 free'd
==3810== at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810== by 0x8049167: free_snp (hap.c:30)
==3810== by 0x80493AF: main (hap.c:73)
==3810==
==3810== Invalid free() / delete / delete[]
==3810== at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810== by 0x8049167: free_snp (hap.c:30)
==3810== by 0x80493AF: main (hap.c:73)
==3810== Address 0x41b1398 is 8 bytes inside a block of size 296 free'd
==3810== at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810== by 0x8049167: free_snp (hap.c:30)
==3810== by 0x80493AF: main (hap.c:73)

请帮我解决这些错误,谢谢。

最佳答案

frag->seq="test str\n";

您还没有malloc'ed 内存块 - 字符串是在静态存储中分配的 - 稍后您尝试free() 该内存块。您只能通过 malloc() 分配 free() block ,否则您可能会遇到未定义的行为。

您可以只将指向静态分配的字符串的指针放入 Frag::seq 字段中,而不是 free() 它们,或者您可以 malloc() 这些字符串的内存并将字符串复制到 malloc block 中。

关于c - free() 错误(使用 valgrind 调试)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1361106/

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