Может ли realloc перемещать указатель, если новый размер меньше?

Мне интересно, гарантирует ли стандарт 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 ?

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Нет гарантии realloc будет возвращать то же местоположение, период.

Ответ 4

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

  • malloc: вызов sbrk.
  • realloc: вызов malloc и memcpy.
  • free: no-op.

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

Ответ 5

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

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

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

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

В соответствии с fooobar.com/questions/77/... ближайший бесплатный документ к необоснованному официальному стандарту C11 Языки программирования - C, проект N1570 - 12 апреля 2011 г. ISO/IEC 9899: 201x; здесь мы находим в 7.22.3.5. Функция realloc:

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

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

Ответ 6

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