Malloc, бесплатный и несколько указателей, как это работает? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть несколько указателей, указывающих на динамически распределенную память, которая была назначена с помощью одного malloc.

int *p1, *p2;
p1 = (int*)malloc(sizeof(int) * 10);
p2 = &p1[5];
free(p2);
p1[5] = 3;
p1[6] = 5;

Теперь мой вопрос: что будет делать выражение «free (p2)»? Будет ли свободная память впереди p1 [5]? Безопасно ли использовать память впереди p1 [5] (то есть p1 [6], p1 [7],.)

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

Освобождение указателя, который не был malloc / calloc ed, является неопределенным поведением.Некоторые распределители, такие как glibc, могут иногда обнаруживать это и детерминистически завершать работу программы с сообщением об ошибке free(): invalid pointer, но технически вы теряете все без исключения гарантии поведения вашей программы, если вы делаете это.

3 голосов
/ 29 мая 2019

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

Из ссылки:

Распределение пространства, ранее выделенного на malloc(), calloc(),aligned_alloc, (начиная с C11) или realloc().

Если ptr - нулевой указатель, функция ничего не делает.

Поведение не определено, если значениеptr не равно значению, возвращенному ранее malloc(), calloc(), realloc() или aligned_alloc() (начиная с C11).

- free, C ++ Reference

Подчеркните: использование вами free в этом контексте будет означать освобождение указателя, который не был получен при использовании какой-либо из этих функций;он был получен путем преобразования указателя, полученного из malloc, и, таким образом, недействителен.

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

Так что не делайте этого.

...