在我的代码中找不到 'Definitely lost memory'

标签 c heap-memory valgrind

我正在尝试创建一些程序以便正确地为测试做好准备,这很快就会完成。 但实际上,经过几天对这些代码的研究,我无法找到 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;
    }
}

没关系,我找到了解决方案,有一个函数,我必须在其中找到整个列表中的最大对,并且我必须单独打印它。所以我将下一个元素的指针设置为 NULL,这个最大元素是倒数第二个,所以最后一个元素丢失了。

最佳答案

Definitely lost memory 是还没有被释放的内存,因为程序不再有指向内存的指针而无法释放。 (有关可能的内存泄漏类型的更完整列表,请参阅 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()缓冲区,尽管有些人会认为这是糟糕的设计。如果它保存了指针,那么内存还没有完全丢失,但程序必须在某个时候运行通过存储指针的存储库并释放它们中的每一个。

关于在我的代码中找不到 'Definitely lost memory',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938836/

相关文章:

c - 对于全局声明时间函数来说,初始化元素不是常量

c - 在不创建新文件的情况下查找并替换文本文件中的特定字符串

c++ - HeapAlloc 的计算复杂度

java - 如何(不)处理高内存使用情况?

c++ - cudaDecodeGL sdk 示例从 Windows 移植到 Linux 后出现内存泄漏

c++ - 用户泄漏、libc++ 泄漏或误报

c - pthread_create 和 pthread_join 用于一些简单的功能

指向 volatile 结构成员的常量指针

c - 堆栈大小会在运行时增长吗?

c - 如何正确分配结构体和某些变量?