Утечка памяти в C с fopen - PullRequest
       43

Утечка памяти в C с fopen

1 голос
/ 19 ноября 2011

У меня есть простая программа, которая в настоящее время производит утечки памяти в соответствии с valgrind, и я не знаю, почему:

char *filename = strrchr(argv[3], "/") + 1;
file = fopen(fileName, "w");

Итак, насколько я знаю, я даю программе argv [3] «test / test2», и первая строка находит последнее вхождение «/», а затем перемещает один символ вперед (к «t»). ). Затем вторая строка открывает файл, который является указателем на массив символов «test».

Почему это вызывает утечку памяти?

Ответы [ 2 ]

5 голосов
/ 19 ноября 2011

Если вы используете открытый файловый поток, есть большая вероятность, что стандартная библиотека ввода-вывода выделит буфер для потока. Если вы явно не закроете поток, есть большая вероятность, что valgrind будет считать эту память все еще используемой; есть внешний шанс, что это будет считаться утечкой.

Что такое точное сообщение от valgrind? Почему вы указываете на fopen()?

Рассмотрим эту тривиальную программу:

#include <stdio.h>

static void leaky(void)
{
    FILE *fp = fopen("/etc/passwd", "r");
    char buffer[2048];
    while (fgets(buffer, sizeof(buffer), fp) != 0)
        fputs(buffer, stdout);
    /* fclose(fp); */
}

int main(void)
{
    leaky();
    return 0;
}

Создает сводный вывод:

==6169== 
==6169== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1)
==6169== malloc/free: in use at exit: 568 bytes in 1 blocks.
==6169== malloc/free: 1 allocs, 0 frees, 568 bytes allocated.
==6169== For counts of detected errors, rerun with: -v
==6169== searching for pointers to 1 not-freed blocks.
==6169== checked 69,424 bytes.
==6169== 
==6169== LEAK SUMMARY:
==6169==    definitely lost: 0 bytes in 0 blocks.
==6169==      possibly lost: 0 bytes in 0 blocks.
==6169==    still reachable: 568 bytes in 1 blocks.
==6169==         suppressed: 0 bytes in 0 blocks.
==6169== Reachable blocks (those to which a pointer was found) are not shown.
==6169== To see them, rerun with: --show-reachable=yes

Если fclose(fp) не закомментировано, вывод будет:

==7125== 
==7125== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1)
==7125== malloc/free: in use at exit: 0 bytes in 0 blocks.
==7125== malloc/free: 1 allocs, 1 frees, 568 bytes allocated.
==7125== For counts of detected errors, rerun with: -v
==7125== All heap blocks were freed -- no leaks are possible.
5 голосов
/ 19 ноября 2011

Ну, ваш код будет пропускать дескриптор файла (последний fopen не закрыт). Однако без более полного примера трудно сказать.

...