c语言 - 在我的代码中找不到'Definitely lost memory'



我正在尝试创建一些程序以正确准备测试,这真的很快就会很快。但是实际上,经过几天的研究,我找不到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_mallocjr_free,然后看看所谓的内容。这些功能依次致电mallocfree

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没有被释放。

最新更新