Удалить выбранное местоположение из набора смежных областей памяти - PullRequest
0 голосов
/ 08 февраля 2012

Я сделал следующее выделение памяти
int * a;
а = таНос (5 ​​* SizeOf (INT));
Есть ли способ просто бесплатно сказать 5-е место этого сета?

т.е. могу ли я сделать бесплатно (+ 4) ??

В настоящее время это дает ошибку ошибки сегментации.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

Нет, вы не можете сделать free(a+4) и т. Д.

Почему?Потому что стандарт С запрещает это.Вы должны передать точный указатель, возвращенный malloc() в free() без какой-либо арифметики указателя.

  • http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html

    Функция free() освобождаетпространство памяти, на которое указывает ptr , которое должно быть возвращено предыдущим вызовом malloc(), calloc() или realloc().

    • Linuxman-страницы не являются самим стандартом C, но практически содержат эквивалентную информацию о функциях библиотеки C.

Почему стандарт запрещает это?Это связано с тем, что в некоторых реализациях malloc() информация заголовка хранится в месте a-4 (или где-либо еще), а free() внутренне считывает ее с помощью арифметики указателя.Если ему дан смещенный указатель, такой как a+4, он пропустит информацию заголовка и будет испорчен.См.

Кстати, некоторые реализации libc предоставляют нестандартные функциикоторые возвращают размер выделенного фрагмента памяти:

Если вам интересно, как они реализованы, и загляните в их исходный код, вы часто обнаруживаете, что они читают информацию заголовка в a-4 и т. Д .:

ОК, вернемся к исходному вопросу. Если вы хотите сократить (или удлинить) блок памяти, выделенный вам malloc(), вы можете использовать realloc(), как сказал @Gustav.Но если вы хотите удалить несколько байтов из середины блока памяти, вам нужно перераспределить и скопировать вручную.На самом деле realloc() может внутренне выполнять аналогичную работу, поэтому будьте осторожны с возвращенным указателем, который может отличаться от исходного.

0 голосов
/ 08 февраля 2012

Если вы хотите освободить только часть пространства, используйте realloc ().

...