简体   繁体   English

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

[英]free() errors (debugging with valgrind)?

I have these structs: 我有这些结构:

typedef struct _Frag{
  struct _Frag *next;
  char *seq;
  int x1; 
  int length;  
}Frag;

typedef struct _Fragment{ 
  int type; 
  Frag *frag_list;   
}Fragment;

And then I created a array 然后我创建了一个数组

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

At the end of program, I want to free the memory, the function is: 在程序结束时,我想释放内存,该函数是:

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);
}

If I use valgrind to debug it, valgrind says that: 如果我使用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)

And please help me to fix these errors, thanx. 并且请帮助我解决这些错误,thanx。

In

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

you haven't malloc 'ed the memory block - the string is allocated in static storage - and later you try to free() that memory block. 您尚未malloc分配内存块-字符串是在静态存储中分配的-稍后您尝试free()该内存块。 You can only free() blocks allocated with malloc() , otherwise you risk running into undefined behaviour. 您只能free()通过malloc()分配的free()块,否则可能会遇到不确定的行为。

You could either only put pointers to statically allocated strings into Frag::seq fields and never free() them or you could malloc() memory for these strings and copy the strings into malloc 'ed blocks. 您可以只将指向静态分配的字符串的指针放入Frag::seq字段中,而从不对它们进行free() ,也可以为这些字符串使用malloc()内存,然后将字符串复制到malloc的块中。

You seemed to be saying that you are freeing this memory as the last thing the program does. 您似乎在说要释放该内存,这是程序的最后一件事。

Why bother? 何必呢? Why not just exit? 为什么不退出呢? Then your deallocation will be perfect, and faster. 这样,您的分配将是完美的,并且速度更快。 It is in fact the recommended technique. 实际上,这是推荐的技术。

I'm pretty sure no commenter will be able to cite an example of an OS that does not free memory resources from programs that terminate. 我敢肯定,没有评论者能够举一个不能从终止程序中释放内存资源的操作系统示例。 Without this critical OS feature, ^C, kill, task manager, program bugs, program crashes ... every abnormal termination would leak memory. 没有这个关键的操作系统功能,^ C,kill,任务管理器,程序错误,程序崩溃……每个异常终止都会泄漏内存。

  1. You're frequently calling molloc() instead of malloc() . 您经常调用molloc()而不是malloc() Check your vowels. 检查您的元音。
  2. You're calling malloc() with the wrong number of arguments - it only takes one. 您正在使用错误数量的参数调用malloc() -仅需一个参数。
  3. You can't assign strings - that performs pointer assignment, which is not what you want. 您不能分配字符串-执行指针分配,这不是您想要的。 You have to use strcpy() or strncpy() or memcpy() , depending on your religious perspective on the whole *cpy() mess, to copy the contents of one string into another. 您必须使用strcpy()strncpy()memcpy() ,具体取决于您对整个*cpy()混乱的*cpy() ,将一个字符串的内容复制到另一个字符串中。

remove the code line "free(fragment)". 删除代码行“ free(fragment)”。 It will work well. 它将运作良好。

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

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