0

我有这些结构:

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)

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

4

4 回答 4

7

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

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

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

于 2009-09-01T07:51:54.927 回答
1

您似乎是在说您正在释放此内存,这是程序所做的最后一件事。

何必?为什么不直接退出?然后你的释放将是完美的,而且更快。这实际上是推荐的技术。

我很确定没有评论者能够引用一个操作系统的例子,它不会从终止的程序中释放内存资源。如果没有这个关键的操作系统功能,^C、kill、任务管理器、程序错误、程序崩溃……每次异常终止都会泄漏内存。

于 2009-09-01T07:52:33.693 回答
1
  1. 你经常打电话molloc()而不是malloc(). 检查你的元音。
  2. 您使用malloc()错误数量的参数调用 - 它只需要一个。
  3. 您不能分配字符串 - 执行指针分配,这不是您想要的。您必须使用strcpy()orstrncpy()memcpy(),根据您对整个*cpy()混乱的宗教观点,将一个字符串的内容复制到另一个字符串中。
于 2009-09-01T07:54:08.167 回答
0

删除代码行“free(fragment)”。它会运作良好。

于 2009-09-03T08:27:26.730 回答