мы можем использовать указатель, освобожденный ранее? - PullRequest
4 голосов
/ 15 февраля 2010

У меня есть вопрос относительно free () в C.

Предположим, у меня есть указатель на некоторую структуру (скажем, node * ptr) .. после освобождения я могу инициализировать его в NULL и указать в каком-то новом месте с помощью malloc () или realloc ()?

Например:

node *ptr=NULL;
ptr=realloc(ptr,sizeof(node)); //works exactly like malloc

/* Do some operations on ptr */

free(ptr);

ptr=NULL;
ptr=realloc(ptr,sizeof(node));

Это действительно, или это создаст проблему. Причина, по которой я использовал realloc вместо malloc, заключается в том, что все мои вызовы realloc () находятся в цикле (поэтому вместо sizeof (node) во втором аргументе это фактически n * sizeof (node), где n продолжает увеличиваться ... и последнее место в этом результирующем массиве записывается с новыми данными), где память, на которую указывает ptr, продолжает увеличиваться до тех пор, пока цикл не завершится, и в этот момент мне не требуются данные в памяти, на которые указывает ptr, поэтому я думаю, что это Лучше всего освободить это. Теперь все это вложено в еще один больший (внешний) цикл.

Большое спасибо за вашу помощь

Ответы [ 3 ]

9 голосов
/ 15 февраля 2010

Это нормально - вы не действительно повторно используете указатель, а просто переменную, содержащую указатель.

7 голосов
/ 15 февраля 2010

ptr не помнит, что когда-то ему было присвоено значение, и его повторное использование, если ему было присвоено значение NULL, ничем не отличается от его использования в первый раз.

И поскольку realloc() действует как malloc(), когда передается NULL-указатель, он должен работать просто отлично.

3 голосов
/ 15 февраля 2010

Вы не должны думать об этом как об «освобождении указателя», а об освобождении того, что указатель указывает на . Совершенно нормально, что указатель указывает сначала на один объект (который затем может быть освобожден), а затем на другой объект.

...