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";