2013-02-25 2 views
1

У меня есть программа, которая читает из файла и сохраняет элементы в очереди, а затем выводит их обратно. Я получаю это от Valgrind:Я где-то не освобождаю память?

HEAP SUMMARY: 
    in use at exit: 302 bytes in 14 blocks 
    total heap usage: 30 allocs, 16 frees, 1,230 bytes allocated 

302 bytes in 14 blocks are definitely lost in loss record 1 of 1 
    at 0x4A05FDE: malloc (vg_replace_malloc.c:236) 
    by 0x372167FB41: strdup (strdup.c:43) 
    by 0x400A6A: addtoqueue(main.c:30) 
    by 0x400B5A: addfiletoqueue(main.c:45) 
    by 0x400C27: main (main.c:62) 

LEAK SUMMARY: 
    definitely lost: 302 bytes in 14 blocks 
    indirectly lost: 0 bytes in 0 blocks 
     possibly lost: 0 bytes in 0 blocks 
    still reachable: 0 bytes in 0 blocks 
     suppressed: 0 bytes in 0 blocks 

линии 62 из main.c

addfiletoqueue (queue, argv[argi]); 

Line 45 из main.c

addtoqueue (queue, file, filename); 

Линия 30 из main.c

readline = strdup (buffer); 
assert (readline != NULL); 
queue_add (queue, readline); 

Нужно ли мне свободно читать?

ответ

5

Да, strdup() динамически выделяет память, которую вы должны free(). На ссылочной странице:

Функция strdup() возвращает указатель на новую строку, которая является дубликатом строки s. Память для новой строки получена с помощью malloc (3) и может быть освобождена со свободной (3).

5

мне нужно освободить Readline ли?

Да. В man page для strdup указано, что он динамически выделяет память для возвращаемого значения. Поэтому вы должны позвонить free в это место позже в вашей программе.

4

Да, вам нужно освободить его, когда вы закончите использовать его.

Это, вероятно, не в addfiletoqueue(), но когда программа выходит. Однако диагностическое сообщение о том, что память «определенно потеряно» подразумевает, что может быть больше проблем, возможно, вы потеряете указатель (и) на этом пути.

В основном strdup() просто вызывает malloc() и strcpy() для вас, так что выделяет память от кучи, которые вам нужно free(), когда вы закончите использовать.

Кроме того, readline - очень плохое имя переменной, так как оно также довольно стандартизировано function name.

+0

Моя переменная readline существует только в пределах цикла for и при попытке ее освобождения я получаю больше ошибок относительно недопустимых размеров чтения и свободных адресов , – KeyHeart

+0

Объем переменной не имеет значения, память, на которую она указывает, должна быть указана функцией 'free()' для того, чтобы быть выделенной. То, что переменная указателя сама выходит из области действия, когда концы цикла не имеют значения. – unwind

+0

Я свободен (очередь), который содержит узлы и линии, но бесплатно, бесплатно все это? Как освободить память readline позже, если я не могу использовать ее в качестве аргумента? – KeyHeart

1

Функция strdup() возвращает указатель на новую строку, которая является дубликатом строки s. Память для новой строки получается с таНос (3), и может быть освобожден с бесплатными (3)

http://www.kernel.org/doc/man-pages/online/pages/man3/strdup.3.html

Valgrind «определенно потерял в записи потери» показывает вашу память утечки кода! Поэтому вам нужно позаботиться о такой ошибке из valgrind ...

Смежные вопросы