c - 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
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)

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

最佳答案

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

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

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

关于c - free() 错误(使用 valgrind 调试)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1361106/

相关文章:

C 结构、内存分配和结构

c - 分配字符数组并打印第一个条目

iphone - 这个分配语句是否适合 clocationmanager?

tomcat - BodyContentImpl jsp标签内存泄露问题

java - "Could not register destruction callback"警告消息导致内存泄漏?

c++ - 使用 libpq 组织 PostgreSQL 数据库连接参数?

c++ - AIX 中的编程内存监视

c++ - 在 MSVC 中,Operator new 在 Debug 模式下的行为与 Release 模式下的行为不同

c# - SoundPlayer 导致内存泄漏?

c - 将输入文件的每一行打印两次?