Освобождение памяти в C - PullRequest
       1

Освобождение памяти в C

2 голосов
/ 04 октября 2010

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

Ответы [ 6 ]

5 голосов
/ 04 октября 2010

Да и нет.

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

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

5 голосов
/ 04 октября 2010

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

4 голосов
/ 04 октября 2010

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

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

1 голос
/ 19 мая 2011

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

1 голос
/ 04 октября 2010

При добавлении к сообщению JoshD, "тип", возвращаемый функцией malloc (), равен void* - так что это не что иное, как необработанный адрес, который вы можете преобразовать в любой из "различных типов и структур".Итак, действительно нормально вызывать free на нем, и он освободит тот же объем памяти, который вы изначально получили, вызвав malloc.

0 голосов
/ 04 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...