2010-10-03 6 views
2

Хорошо, это, наверное, глупый вопрос, но здесь идет: В C достаточно ли просто использовать free() для возврата указателя malloc, хотя область памяти, выделенная malloc, может быть огромные и, возможно, были заброшены в разные типы и структуры и т. д.?Освобождение памяти в C

ответ

5

Да. Менеджер памяти позаботится об этом. Он знает, насколько большой объем памяти, и до тех пор, пока вы не будете писать за пределы размера malloc(), все будет хорошо.

1

Добавление к сообщению JoshD «тип», возвращаемое malloc(), равно void* - так что это не что иное, как необработанный адрес, который вы можете ввести в любой из «разных типов и расположений». Таким образом, на самом деле нормально звонить на него, и он выпустит тот же объем памяти, который вы изначально получили, вызвав malloc.

4

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

Что касается вопроса о «возможно, были лишены различные типы и структуры и т. Д.», - нет проблем с тем, что касается malloc() и free(), поскольку, когда вы освобождаете блок, его активно не используют. Тем не менее, возможно, вам придется беспокоиться о других проблемах, связанных с кастингом в «разные типы и структуры», например, проблемы выравнивания и сглаживания, но malloc() и free() не участвуют в этом (пока вы не повредите память за пределами выделенного блок).

5

Да и №

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

Нет: если вы сохранили указатели там другие распределения malloc «ред и не есть еще одна копии этих указателей, освобождая исходное распределение без освобождения детей первым будут утечкой памяти.

0

в зависимости от должности dmckee, вы должны подумать о том, как вы строите свою структуру: , если это что-то вроде b-дерева, списка. массив указателя на другую динамически распределенную структуру, ну, в этом случае вы должны FIRST free childrens (например, дочерний узел b-дерева), а затем вернуться к корню (возможно, рекурсивно, в зависимости от структуры). Это очень распространенная ошибка, и это может вызвать много утечек памяти.

1

Простой способ подумать о том, что каждый malloc должен иметь соответствующий свободный. Если вы malloc структуру, которая содержит указатели на другие элементы malloc'ed, освобождение этой структуры не освобождает другие объекты, на которые указывает. Эти другие предметы должны быть освобождены в какой-то момент, чтобы не утечка памяти.

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