Почему локальная память кучи потока не освобождается при выходе из потока? - PullRequest
2 голосов
/ 26 октября 2011

Ссылаясь на эту конструкцию, публикация полного примера была бы слишком большой:

__thread char* buf;
buf = malloc(1000);

Вэлгринд говорит, что байты "определенно" потеряны.Разве они не должны быть «все еще достижимы»?

Ответы [ 5 ]

9 голосов
/ 26 октября 2011

Поскольку выделенная память не является локальной для потока.Он является общим для всех потоков.

С другой стороны, переменная является локальной для потока, поэтому, как только она выходит из области видимости, выделенная память будет точно потеряна (если в другом месте нет копий этого указателя).и, очевидно, нет, потому что отчеты Valgrind определенно потеряли)

Вы должны free это.

2 голосов
/ 26 октября 2011

Ну, как уже говорили другие, вы должны free это.

Причина этого заключается в следующем: все потоки имеют общую кучу, и концептуально «владение» памятью может передаваться между потоками.,Один поток может испортить что-то, а другой - освободить.Но куча не знает, кто «владеет» памятью, поэтому, когда ваш поток завершается (даже если куча запомнила, какой поток malloc'd что), он не может безопасно удалить его.

Но, когда ваш процесс завершается, вся кучная память фактически «освобождается», но не индивидуально: вся куча вашего процесса (которая, вероятно, была всего лишь одним большим куском) возвращается в операционную систему.

2 голосов
/ 26 октября 2011

Если единственным указателем на блок является локальный поток, то при выходе из потока вы потеряете единственный указатель.

Это означает, что он больше недоступен = определенно потерян.

2 голосов
/ 26 октября 2011

Вам необходимо явно освободить его, вызвав free.

Память, выделенная для кучи, выделенная malloc, не освобождается, пока не будет явно освобождена путем вызова free.Только выделенные стеком локальные объекты хранения автоматически освобождаются при завершении потока.

Это определенно потеряно, поскольку у вас нет указателя на выделенную память после выхода из потока. Указатель, указывающий на память, является локальнымв стек потока, и он уничтожается при выходе из потока, но выделенная память является кучей памяти, и она не выделяется.

0 голосов
/ 12 февраля 2015

Это немного похоже на аргумент "отличный вкус" / "меньше наполнения". Valgrind верен И данные «все еще доступны». Например, если данные содержат пароли, вы можете на 100% извлечь их из сканирования кучи. Если данные начинаются с уникального случайного числа, вы можете переместить его. Valgrind означает, что вы больше не можете получить доступ к данным через указатель.

...