首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >free()错误(使用valgrind进行调试)?

free()错误(使用valgrind进行调试)?
EN

Stack Overflow用户
提问于 2009-09-01 07:46:38
回答 4查看 1.4K关注 0票数 0

我有这些结构:

代码语言:javascript
复制
typedef struct _Frag{
  struct _Frag *next;
  char *seq;
  int x1; 
  int length;  
}Frag;

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

然后我创建了一个数组

代码语言:javascript
复制
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";

在程序的最后,我想释放内存,函数是:

代码语言:javascript
复制
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会这样说:

代码语言:javascript
复制
=============================================
==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)

请帮我修复这些错误,谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-03 08:27:27

删除代码行"free(fragment)“。它会工作得很好。

票数 0
EN

Stack Overflow用户

发布于 2009-09-01 07:51:55

在……里面

代码语言:javascript
复制
frag->seq="test str\n";

你还没有malloc内存块--字符串是分配在静态存储中的--然后你尝试free()那个内存块。你只能free()malloc()分配的内存块,否则你可能会遇到未定义的行为。

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

票数 7
EN

Stack Overflow用户

发布于 2009-09-01 07:52:34

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

为什么要麻烦呢?为什么不直接退出呢?然后,您的重新分配将是完美的,并且更快。It is in fact the recommended technique.

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1361106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档