Безопасно ли использовать malloc для выделенного указателя в C? - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над библиотекой C и стараюсь быть очень осторожным с управлением памятью.У меня есть функция, которая выделяет память для указателя, и я пытаюсь охватить случай, в котором указатель уже выделен.Мне интересно, нужно ли освободить указатель перед его выделением.

char *x = (char *) malloc(12);
// ...
free(x);
x = (char *) malloc(12);

Я не уверен, что free(x) необходим.

Ответы [ 3 ]

5 голосов
/ 01 апреля 2019

Нет такого понятия, как выделенный указатель.

char *x = (char *) malloc(12); объявляет указатель x. Затем он выделяет 12 байтов памяти и указывает x на 12 байтов памяти.

free(x); освобождает 12 байтов памяти. x по-прежнему указывает на 12 байтов памяти, которые теперь освобождены.

x = (char *) malloc(12); выделяет еще 12 байтов памяти и заставляет x указывать на новые 12 байтов памяти.

Если вы удалили free(x);, вы бы выделили 2 лота по 12 байт памяти, а не освободили первый лот. Является ли это утечкой памяти или нет, зависит от того, как ваша программа должна работать - это только утечка памяти, если вы все еще не используете память для чего-то.

2 голосов
/ 01 апреля 2019

Да, free(x) необходимо. Если вы удалите его, вы обязательно потеряете память при следующем malloc(12). Теперь, если размеры действительно идентичны, тогда я задаюсь вопросом, действительно ли вам нужна эта вторая malloc. Если размеры отличаются, вы можете использовать realloc() и удалить free.

0 голосов
/ 02 апреля 2019

Это безопасно, так сказать: вы не подвергаетесь никакому неопределенному поведению.Но вы теряете память, если вы не сохранили адрес, заданный первым malloc(), как это должно быть free() d в какой-то момент позже.

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

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

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