У меня есть функция с циклом for и внутри цикла (и в зависимости от ввода) определенные переменные инициализируются один раз (в первый раз) с помощью malloc()
.
Эти переменные объявлены так:
static double *vector;
А затем я выделяю память, используя
malloc(size*sizeof(double));
Вопрос в том:
Должен ли я освобождать эти переменные на последней итерации цикла внутри вызываемой функции или нет?
ОБНОВЛЕНИЕ: может быть, для некоторых я неправильно объяснил. Дело в том, что вызываемая функция (func_A) выделяет память для определенных векторов, которые она использует, в зависимости от ввода от основной функции. Затем эта функция func_A вызывается несколько раз из цикла в main. Вот почему я определяю переменные как статические, чтобы они не определялись каждый раз при вызове func_A (из-за затрат времени), потому что размеры не меняются на протяжении всего прогона. Переменные статические, но не глобальные, поэтому я не могу освободить их от основных (верно?).
5 ответов
Вы должны всегда уравновешивать malloc
обращением к free
.
В вашем случае вы можете вызвать его, когда знаете, что вам больше не нужен vector
.
Если это нецелесообразно, вы всегда можете позвонить на atexit
; передавая ему указатель на подходящую функцию, которая будет free
памятью. См. http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm
Хотя вы часто можете рассчитывать на то, что операционные системы очистят за вас при завершении программы, полагаться на это довольно грубо.
Вам нужно освободить указатель. как правило - все, что вы выделяете с помощью malloc / new, находится в куче и должно быть освобождено / удалено, все остальное находится в стеке и не
P.s. если вы использовали только язык, собранный с помощью grbage, например java / go / python, вам не нужно было бы знать ничего из этого
Нужно ли мне освобождать эти переменные на последней итерации цикла внутри вызываемой функции?
Вы можете , но не обязаны .
Вам нужно только free()
выделить память, выделенную функциями распределителя памяти, когда она вам больше не нужна.
Одна из основных целей выделения памяти с использованием malloc()
и семейства - преодолеть ограничение в отношении области действия локальных переменных ( возврат адреса локальной переменной из функции недопустим ), поэтому вы никогда не < strong> должен free()
память "внутри вызываемой функции" . Вы можете очень хорошо вернуть указатель (возвращаемый malloc()
) вызывающей стороне, выполнить некоторые другие операции с этим указателем (памятью), а затем очистить (free()
) указатель от вызывающей стороны подпрограммы. -функция.
Однако следует помнить одну вещь: вам необходимо передать точный указатель на free()
, который изначально был возвращен malloc()
или семейством.
Кажется, что вектор выделяется один раз, а затем используется в течение всего срока действия программы. Вектор хранится в статической переменной. Перед завершением программы было бы неплохо освободить вектор, но завершение также сделает это за вас.
Похоже, что функция не готова работать с разными (в частности, большими) размерами векторов в течение времени жизни программы.
Каждый вызов malloc должен иметь соответствующий бесплатный вызов, когда данные больше не используются.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.