繁体   English   中英

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

[英]free() errors (debugging with 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
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)

并且请帮助我解决这些错误,thanx。

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

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

您可以只将指向静态分配的字符串的指针放入Frag::seq字段中,而从不对它们进行free() ,也可以为这些字符串使用malloc()内存,然后将字符串复制到malloc的块中。

您似乎在说要释放该内存,这是程序的最后一件事。

何必呢? 为什么不退出呢? 这样,您的分配将是完美的,并且速度更快。 实际上,这是推荐的技术。

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

  1. 您经常调用molloc()而不是malloc() 检查您的元音。
  2. 您正在使用错误数量的参数调用malloc() -仅需一个参数。
  3. 您不能分配字符串-执行指针分配,这不是您想要的。 您必须使用strcpy()strncpy()memcpy() ,具体取决于您对整个*cpy()混乱的*cpy() ,将一个字符串的内容复制到另一个字符串中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM