Освобождение памяти после использования - PullRequest
2 голосов
/ 19 января 2010

У меня есть программа командной строки C, для которой я использую функцию calloc (), чтобы назначить некоторую память для структуры, в которой также есть структура с некоторым назначенным объемом памяти.

Если я использую функцию free () для освобождения памяти из родительской структуры, будет ли она также освобождать память из дочерней структуры?

Или я должен сначала освободить память от дочерней структуры?

Ответы [ 6 ]

13 голосов
/ 19 января 2010

Это простое правило: при каждом выделении памяти вы должны явно освобождать память самостоятельно. Итак, вам нужно самостоятельно освободить детскую память.

6 голосов
/ 19 января 2010

Нет, сначала нужно освободить память от ребенка.

1 голос
/ 20 января 2010

Всегда сначала отпускайте детские конструкции. Может быть целесообразно написать функции, которые освободят каждый тип структуры, чтобы упростить жизнь дальше по линии. Если structTypeA содержит structTypeB и StructTypeC, это позволит вам просто вызвать freeStructTypeA (указатель на sTA-экземпляр) и заставить функцию позаботиться об освобождении всех дочерних структур перед освобождением самой structTypeA.

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

0 голосов
/ 19 января 2010

Я думаю, стоит упомянуть, что для коротко работающих инструментов командной строки это часто не имеет значения. Как только ваша программа завершит работу, операционная система все равно освободит всю память. Однако, если это инструмент, который работает в течение неопределенного периода времени, вам нужно беспокоиться об управлении памятью, и у других ответов есть хороший совет.

0 голосов
/ 19 января 2010

Может вообще не потребоваться освобождение памяти, так как вся выделенная память освобождается после завершения программы. Вам нужно вызывать free (), только если вы хотите сэкономить память.

0 голосов
/ 19 января 2010

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

...