C free()错误(使用valgrind调试)?
我有以下结构:C free()错误(使用valgrind调试)?,c,memory-management,memory-leaks,free,valgrind,C,Memory Management,Memory Leaks,Free,Valgrind,我有以下结构: 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 fragme
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);
}
请帮我修复这些错误,thanx。中的
frag->seq="test str\n";
您还没有malloc
“释放内存块-字符串在静态存储中分配-稍后您尝试free()
释放该内存块。您只能使用malloc()
分配的free()
块,否则您可能会遇到未定义的行为
您可以只将指向静态分配字符串的指针放在
Frag::seq
字段中,而从不free()
它们,也可以malloc()
为这些字符串释放内存,并将字符串复制到malloc
的块中。您似乎在说,您正在释放此内存,就像程序所做的最后一件事一样
为什么要麻烦?为什么不直接退出呢?然后,您的解除分配将是完美的,而且更快
我很确定没有评论者能够举出一个操作系统的例子,它不能从终止的程序中释放内存资源。如果没有这个关键的操作系统功能,^C、kill、任务管理器、程序错误、程序崩溃。。。每次异常终止都会泄漏内存
molloc()
,而不是malloc()
。检查你的元音malloc()
strcpy()
或strncpy()
或memcpy()
,这取决于您对整个*cpy()
mess的宗教观点,以将一个字符串的内容复制到另一个字符串中删除代码行“free(fragment)”。它会很好地工作。您使用的是什么malloc实现?POSIX将malloc定义为“void*malloc(大小);”。你似乎也在用我从未见过的“莫洛克”。这可能是打字错误吗?@Kristof-POSIX没有定义
malloc()
-ANSI/ISO有。@GMan:操作系统也会释放这些资源。当然,您不应该依赖它(请参阅Sharptooth评论)。@everyone:我想您也会对STL库在常见问题解答中的以下陈述投反对票:“在大多数环境中,这会产生严重的反作用;free通常必须在操作系统收回它们之前接触许多长的未引用页面。它通常会在程序退出时引入显著的延迟,并且可能会将其他应用程序的大部分页面调出。这个操作没有任何好处,因为操作系统在程序退出时会回收内存,并且应该在不接触内存的情况下回收内存。“=)对于标准应用程序来说,在退出之前释放内存是荒谬的。它所做的只是用一个巨大的马金来减缓退出的速度。我想不出有哪一个操作系统不能收回程序打开的资源,我怀疑其他人也能。这就是操作系统的全部要点。这就是它们被制造的原因。这就是为什么它们仍然被制造出来。退出之前释放是只适用于如果程序驻留在内存中,例如设备驱动程序,或者帮助您调试某些东西。想象两个程序使用相同的东西,使用堆,但一个是C和另一个C++。我说堆将以类似的状态结束,因为这两个程序以相同的顺序分配和释放了大约相同的内存。请告诉我,STL FAQ的“高度适得其反”警告背后的逻辑如何以任何微小的方式应用于一个堆,而不是另一个几乎相同的堆?请注意,我并不是在为糟糕的代码辩护,只是提出了一个你似乎都不愿意承认的性能考虑。digitalross知道他在说什么。令人沮丧的是,程序员们热情地说“总是释放内存”;是的,这是一个好习惯,但在典型情况下,在退出时释放所有分配的内存会影响性能。
frag->seq="test str\n";