У меня есть функция с циклом for и внутри цикла (и в зависимости от ввода) определенные переменные инициализируются один раз (в первый раз) с помощью malloc().

Эти переменные объявлены так:

static double *vector;

А затем я выделяю память, используя

malloc(size*sizeof(double));

Вопрос в том:

Должен ли я освобождать эти переменные на последней итерации цикла внутри вызываемой функции или нет?

ОБНОВЛЕНИЕ: может быть, для некоторых я неправильно объяснил. Дело в том, что вызываемая функция (func_A) выделяет память для определенных векторов, которые она использует, в зависимости от ввода от основной функции. Затем эта функция func_A вызывается несколько раз из цикла в main. Вот почему я определяю переменные как статические, чтобы они не определялись каждый раз при вызове func_A (из-за затрат времени), потому что размеры не меняются на протяжении всего прогона. Переменные статические, но не глобальные, поэтому я не могу освободить их от основных (верно?).

2
Pelayo Peñarroya 8 Сен 2016 в 10:57

5 ответов

Лучший ответ

Вы должны всегда уравновешивать malloc обращением к free.

В вашем случае вы можете вызвать его, когда знаете, что вам больше не нужен vector.

Если это нецелесообразно, вы всегда можете позвонить на atexit; передавая ему указатель на подходящую функцию, которая будет free памятью. См. http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm

Хотя вы часто можете рассчитывать на то, что операционные системы очистят за вас при завершении программы, полагаться на это довольно грубо.

4
Bathsheba 8 Сен 2016 в 08:01

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

P.s. если вы использовали только язык, собранный с помощью grbage, например java / go / python, вам не нужно было бы знать ничего из этого

0
akiva 8 Сен 2016 в 08:01

Нужно ли мне освобождать эти переменные на последней итерации цикла внутри вызываемой функции?

Вы можете , но не обязаны .

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

Одна из основных целей выделения памяти с использованием malloc() и семейства - преодолеть ограничение в отношении области действия локальных переменных ( возврат адреса локальной переменной из функции недопустим ), поэтому вы никогда не < strong> должен free() память "внутри вызываемой функции" . Вы можете очень хорошо вернуть указатель (возвращаемый malloc()) вызывающей стороне, выполнить некоторые другие операции с этим указателем (памятью), а затем очистить (free()) указатель от вызывающей стороны подпрограммы. -функция.

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

0
Sourav Ghosh 8 Сен 2016 в 08:08

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

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

0
Paul Ogilvie 8 Сен 2016 в 08:01

Каждый вызов malloc должен иметь соответствующий бесплатный вызов, когда данные больше не используются.

0
Jurza 8 Сен 2016 в 08:01