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

Мне интересно, гарантирует ли стандарт C или C ++, что указатель не изменяется при вызове realloc с меньшим (ненулевым) размером:

size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?

По сути, может ли ОС самостоятельно решить, что, поскольку мы освободили большой блок памяти, он хочет использовать все перераспределения для дефрагментации памяти и каким-то образом переместить ptr2?

Ответы [ 6 ]

17 голосов
/ 15 ноября 2009

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

После успешного завершения с размером, не равным 0, realloc () возвращает указатель на (возможно, перемещенный) выделенное пространство.

Нет, без гарантии

7 голосов
/ 15 ноября 2009

Нет гарантии realloc вернет то же место, точка.

6 голосов
/ 15 ноября 2009

С realloc вы не получаете абсолютно никаких гарантий относительно того, где память будет жить после слов. Я полагаю, что malloc по умолчанию в libc будет только неохотно копировать память, так что практически вы можете быть в порядке Но не рассчитывайте на это.

4 голосов
/ 22 сентября 2010

realloc не требуется оставлять блок на месте, даже если он уместился, и на самом деле простейшая реализация заглушки - это пример, где он не может:

  • malloc: звонок sbrk.
  • realloc: звоните malloc и memcpy.
  • free: не работает.

Это может показаться смешным, но иногда для встроенных систем реализация, как я только что описал, на самом деле является оптимальной.

2 голосов
/ 04 августа 2014

Мне кажется, что все текущие ответы (на момент этого ответа) не относятся ни к одному стандартному документу.

Для C ++ я буду ссылаться на Рабочий проект, Стандарт для языка программирования C ++ , Номер документа: N3337, Дата: 2012-01-16, Редакции: N3291 , что, согласно https://isocpp.org/std/the-standard, - ближайший бесплатный документ к несвободному официальному стандартному документу C ++ 11; здесь мы находимся в 20.6.13 C библиотеке :

2 Содержимое совпадает с заголовком библиотеки Standard C, со следующими изменениями: [по моему мнению, перечисленные изменения не имеют отношения к вопрос].

Так что теперь мы должны обратиться к стандарту C.

Согласно https://stackoverflow.com/a/83763/15485 ближайшим бесплатным документом к несвободному официальному стандартному документу C11 является Языки программирования - C , проект комитета N1570 - 12 апреля 2011 г. ИСО / МЭК 9899: 201x ; здесь мы находим в 7.22.3.5 функцию realloc :

4 Функция realloc возвращает указатель на новый объект (, который может иметь то же значение, что и указатель на старый объект ), или нуль указатель, если новый объект не может быть выделен.

Я не являюсь носителем английского языка, и поэтому вам решать, что означает "может иметь".

0 голосов
/ 15 ноября 2009

В Windows C-Runtime захватывает кучу, а затем выделяет память из этой кучи. Таким образом, ОС не будет знать об отдельных распределениях памяти и, следовательно, не будет ничего менять.

...