2010-01-19 3 views
2

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

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

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

+0

несколько связанных: http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont

+0

Вы также использовали calloc/malloc для дочерней структуры? – quinmars

+0

Если вы использовали calloc() для дочерней структуры, вы должны использовать free() в этой памяти. В противном случае по мере того как ваша программа будет работать, она постепенно будет потреблять все больше и больше памяти. (Если ваша программа не делает этого намного до выхода, это не очень важно, но если вы сделаете это в цикле, вы можете даже сбой.) – egrunin

ответ

13

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

+6

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

6

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

0

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

0

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

+0

Что делать, если родительская структура создается и удаляется внутри цикла? – egrunin

0

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

+5

Я думаю, что это плохой совет сказать «пусть OS позаботится об этом», даже если это для небольшой программы. Вы не хотите привыкать писать нечеткий код. – Trent

1

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

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

+0

Я полностью согласен. Если структура содержит динамически распределенные дочерние элементы, обычно проще всего написать функцию для обработки освобождения структуры и всех связанных дочерних объектов. – bta

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