Valgrind и глобальные переменные - PullRequest
2 голосов
/ 22 января 2011

Я использую valgrind для поиска утечек памяти.Я выделил две глобальные переменные в основной функции;затем, в конце main я освобождаю оба, но Вальгринд продолжает писать:

==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==18311==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311==    by 0x804A30C: main (application.c:730)
==18311== 
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2
==18311==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311==    by 0x804A31D: main (application.c:731)

Краткое описание утечки:

==18311== LEAK SUMMARY:
==18311==    definitely lost: 32 bytes in 2 blocks
==18311==    indirectly lost: 0 bytes in 0 blocks
==18311==      possibly lost: 0 bytes in 0 blocks
==18311==    still reachable: 0 bytes in 0 blocks
==18311==         suppressed: 0 bytes in 0 blocks

Почему я не могу освободить эти две переменные?1008 *

Редактировать

someList *something; *something_else;

Используемая структура имеет два поля типа char * и поле someList *next.Позже есть много кода.Несколько потоков собираются добавлять / редактировать / удалять объекты, используя эти две переменные.

something -> object 1 -> ... -> object n
something_else -> object 1 -> ... -> object m

Где -> означает, что something->next = object 1 и object k являются экземплярами someList *.

В конце приложения я освободил каждое поле каждого элемента object k.Затем в последней части:

free(something);
free(something_else);

Возможно, я забыл освободить поле объекта.Может ли это привести к тому, что у меня здесь такое поведение?

Надеюсь, теперь все понятнее.

Ответы [ 2 ]

1 голос
/ 22 января 2011

Вы уверены, что освободили все свои переменные? Вальгринд говорит, что это не так.

Попробуйте сделать ваш код более тонким и опубликуйте его здесь, или запустите еще одну отладку.

0 голосов
/ 22 января 2011

Для каждого malloc() вызова обычно требуется соответствующий free() вызов, чтобы избежать утечек памяти.Для оптимального использования памяти вы должны free() каждый выделенный блок памяти как можно скорее после того, как закончите с ним.

В вашем случае, у вас есть два malloc() вызова в application.c:730 и application.c:731,для которого нет вызова free(), сделанного к моменту завершения вашей программы.Поэтому выделенные там блоки памяти не освобождаются.Это приводит к утечке памяти, которую Valgrind обнаруживает и сообщает.

Если вы не предоставите нам некоторый код и / или дополнительную информацию о вашей программе, мы не сможем вам помочь.

РЕДАКТИРОВАТЬ:

В вашем выводе Valgrind есть две интересные строки:

==18311==    definitely lost: 32 bytes in 2 blocks
...
==18311==    still reachable: 0 bytes in 0 blocks

Вы определенно "потеряли" два блока памяти и на них нет указателей во время вашей программызавершается.Это означает, что указатели на эти два блока были фактически перезаписаны или иным образом утратили свое значение в ходе вашей программы.

Распространенной причиной этой проблемы является сохранение результата двух malloc() вызовов одного и того жеуказатель без промежуточного free() вызова.Другая возможная причина - измененное значение указателя из-за арифметических операций с указателями - Valgrind делает попытку обнаружить некоторые из этих случаев, но это не всегда успешно, в зависимости от вашего кода.

...