Valgrind сообщает о потерянных байтах даже после использования free () - PullRequest
0 голосов
/ 24 февраля 2019

Я пробовал несколько вещей на языке Си после прочтения о распределении памяти.Казалось, все было довольно мягким и привлекательным, пока я не застрял в этой программе.Это работает, как задумано, но valgrind ясно заявляет совершенно другую историю.Вот моя программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NSTRINGS 3

int main()
{
    char **v = NULL;
    int sum = 0;
    char str[80]={'\0'};
    int i = 0, pos = 0;
    v = (char**) calloc((NSTRINGS * sizeof(char*)),1);

    while(1)
    {
        for(i = 0; i < NSTRINGS; i++)
        {
            printf("[%d] ", i+1);
            if(v[i] == NULL)
                printf("(Empty)\n");
            else
                printf("%s\n", v[i]);
        }

        do        
        {
            printf("New string's position (1 to %d): ", NSTRINGS);
            scanf("%d", &pos);
            getchar(); /* discards '\n' */
        }
        while(pos < 0 || pos > NSTRINGS);

        if (pos == 0){
            i = 0;
            break;
        }
        else{
            printf("New string: ");
            fgets(str, 80, stdin);
            str[strlen(str) - 1] = '\0';
            v[pos - 1] = realloc(v[pos - 1], strlen(str)+1);
            strcpy(v[pos - 1], str);
        }
    }
    free(v);
    v = NULL;
    return 0;
}

Единственная цель - выделить 3 строки в соответствии с необходимым пространством (чтобы сохранить неиспользованную строку).Но потом, даже после использования free (v), вот что возвращает мне valgrind (заполняя их по порядку на 1 2 3, а затем на 0):

[...]
==6760== 
==6760== HEAP SUMMARY:
==6760==     in use at exit: 20 bytes in 3 blocks
==6760==   total heap usage: 6 allocs, 3 frees, 2,092 bytes allocated
==6760== 
==6760== 20 bytes in 3 blocks are definitely lost in loss record 1 of 1
==6760==    at 0x4C2FA3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6760==    by 0x4C31D84: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6760==    by 0x4009EB: main (in /home/esdeath/Prog/PL2/a.out)
==6760== 
==6760== LEAK SUMMARY:
==6760==    definitely lost: 20 bytes in 3 blocks
==6760==    indirectly lost: 0 bytes in 0 blocks
==6760==      possibly lost: 0 bytes in 0 blocks
==6760==    still reachable: 0 bytes in 0 blocks
==6760==         suppressed: 0 bytes in 0 blocks
==6760== 
==6760== For counts of detected and suppressed errors, rerun with: -v
==6760== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0

И с этим у меня есть два вопроса:действительно пытался ответить, но я боюсь, что мой опыт, на данный момент, не позволяет мне:

  • Во-первых, он утверждает, что у меня есть 3 распределения, даже если я никогда не использую /достичь функции realloc.Означает ли это, что функция calloc использует 3 allocs в одиночку?И если так, то почему?

  • Во-вторых, как мне точно освободить 20 байтов (в этом сценарии)?Я действительно запутался ...

Заранее спасибо.


Примечание: Я узнаю, что "realloc" может возвращать NULL (в случае сбоя), и я добавил это в программу.Если это не было неправильно установлено, Valgrind продолжал сообщать о той же самой проблеме, таким образом, я заканчивал тем, что удалил это (в процессе отмены) ...

1 Ответ

0 голосов
/ 24 февраля 2019

Вы не free используете память, выделенную realloc.Добавить

for (int i = 0; i < NSTRINGS; ++i)
    free(v[i]);

до

free(v);
...