[英]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,任务管理器,程序错误,程序崩溃……每个异常终止都会泄漏内存。
molloc()
instead of malloc()
. molloc()
而不是malloc()
。 Check your vowels. malloc()
with the wrong number of arguments - it only takes one. malloc()
-仅需一个参数。 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.