我有这些结构:
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)请帮我修复这些错误,谢谢。
发布于 2009-09-03 08:27:27
删除代码行"free(fragment)“。它会工作得很好。
发布于 2009-09-01 07:51:55
在……里面
frag->seq="test str\n";你还没有malloc内存块--字符串是分配在静态存储中的--然后你尝试free()那个内存块。你只能free()用malloc()分配的内存块,否则你可能会遇到未定义的行为。
您可以只将指向静态分配的字符串的指针放入Frag::seq字段中,而从不对它们执行free()操作;或者您也可以为这些字符串分配malloc()内存,然后将字符串复制到malloc的块中。
发布于 2009-09-01 07:52:34
您似乎是在说,您正在释放这个内存,作为程序所做的最后一件事。
为什么要麻烦呢?为什么不直接退出呢?然后,您的重新分配将是完美的,并且更快。It is in fact the recommended technique.
我敢肯定没有评论者能够举出一个操作系统不能从终止的程序中释放内存资源的例子。如果没有这个关键的操作系统功能,^C、kill、任务管理器、程序错误、程序崩溃...每次异常终止都会泄漏内存。
https://stackoverflow.com/questions/1361106
复制相似问题