Если внутри функции вызывается free (), она освобождается только локально? - PullRequest
2 голосов
/ 17 марта 2019

Все еще изучаю веревки распределения и освобождения, и мне интересно кое о чем.

Допустим, вы выделяете память для массива:

int *array = malloc(5 * sizeof(int));

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

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

1 Ответ

7 голосов
/ 17 марта 2019

Нет, free() освобождает память глобально, точно так же, как malloc() выделяет память глобально. То есть память выделяется и, если указатель на нее сделан доступным (аргумент функции, возвращаемое значение функции, глобальная переменная), она остается выделенной и доступной неограниченное время - до тех пор, пока она не будет освобождена или программа не выйдет (или она не просочится; больше действительный доступный указатель на память). И выделенная память, которая освобождается, освобождается на неопределенный срок. Он может быть снова доступен другим распределением, но это случайно.

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

...