我正在尝试创建一些程序以正确准备测试,这真的很快就会很快。但是实际上,经过几天的研究,我找不到Valgrind报告的记忆泄漏实际上是。
。我尝试了几乎所有内部和外部指针。我尝试释放一些不必要的指针,没有任何结果。
这是结构:
typedef struct cop {
int primo;
int secondo;
struct cop *next;
} coppia
这些是函数:
coppia *crea_coppia(int x, int y)
{
coppia *el=malloc(sizeof(coppia));
el->primo=x;
el->secondo=y;
el->next=NULL;
return el;
}
coppia *crea_coppia_bin(FILE *f)
{
int buf[2];
int e = fread(buf,sizeof(int),2,f);
if(e!=2) return NULL;
coppia *el = crea_coppia(buf[0],buf[1]);
if(el==NULL) return NULL;
return el;
}
coppia *crea_lista(char *nomefile)
{
FILE *f = fopen(nomefile,"rb");
coppia *lis=NULL;
coppia *el=NULL;
while(true)
{
el=crea_coppia_bin(f);
if(el==NULL)
break;
lis=inserisci_coppia(lis,el);
}
fclose(f);
return lis;
}
valgrind输出:
==434== HEAP SUMMARY:
==434== in use at exit: 16 bytes in 1 blocks
==434== total heap usage: 9 allocs, 8 frees, 8,840 bytes allocated
==434==
==434== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
==434== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==434== by 0x10896D: crea_coppia (provaesame.c:18)
==434== by 0x1089D1: crea_coppia_bin (provaesame.c:53)
==434== by 0x108A12: crea_lista (provaesame.c:77)
==434== by 0x108B6D: main (provaesamemain.c:21)
==434==
==434== LEAK SUMMARY:
==434== definitely lost: 16 bytes in 1 blocks
==434== indirectly lost: 0 bytes in 0 blocks
==434== possibly lost: 0 bytes in 0 blocks
==434== still reachable: 0 bytes in 0 blocks
==434== suppressed: 0 bytes in 0 blocks
==434==
==434== For counts of detected and suppressed errors, rerun with: -v
==434== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
这是将元素插入列表的函数:
coppia *inserisci_coppia(coppia *lis, coppia *el)
{
if(lis==NULL)
{
lis=el;
return lis;
}
else
{
el->next=lis;
lis=el;
return lis;
}
}
这是免费功能:
void distruggi_lista_coppie(coppia *lis)
{
while(lis!=NULL)
{
coppia *prossimo=lis->next;
jr_free(lis);
lis=prossimo;
}
}
没关系,我找到了解决方案,在我必须找到整个列表中最多的几个的功能中,我必须单独打印。因此,我将下一个元素的指针取消,最大元素是第二个元素,因此最后一个元素丢失了。
肯定是丢失的内存是尚未释放的内存,并且由于程序不再具有指向内存的指针,因此无法释放。(有关可能的内存泄漏类型的更完整列表,请参见Valgrind FAQ。(
如果不清楚,这是一个简单的例子:
char* buffer;
while (1) {
buffer = malloc(BUF_LEN);
if (fgets(buffer, BUF_LEN, stdin) == NULL) break;
fprintf(stderr, "Read: %s", buffer);
// process(buffer);
}
第二次通过循环,唯一的分配记忆指针丢失了,因为它没有释放,唯一的指针被覆盖了。由于该程序不再具有指向第一个分配的buffer
的指针,因此稍后再也无法free()
。
在实际实现中,process
可能会执行保留指针的操作(例如,将其插入链接列表中(,或者甚至可能会free()
缓冲区,尽管有些人会考虑这种不良设计。如果它保存了指针,那么内存尚未确定丢失,但是该程序必须在某个时候通过存储的指针的存储库并释放它们。
我会添加我自己的jr_malloc
和jr_free
,然后看看所谓的内容。这些功能依次致电malloc
和free
。
void *jr_malloc(size_t size)
{
void *p = malloc(size);
fprintf(stderr, "malloc: %d %pn", size, p);
return p;
}
void jr_free(void *p)
{
fprintf(stderr, "free: %pn", p);
free(p);
}
您可以比较并查看哪些p
没有被释放。