Ответ 1
http://opengroup.org/onlinepubs/007908775/xsh/realloc.html
После успешного завершения с размером, не равным 0, 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?
http://opengroup.org/onlinepubs/007908775/xsh/realloc.html
После успешного завершения с размером, не равным 0, realloc() возвращает указатель на (возможно перемещенное) выделенное пространство.
Нет, нет гарантии
С realloc
вы не получите абсолютно никаких гарантий относительно того, где память будет жить послесловие. Я считаю, что libc default malloc будет только скучно копировать память, так что практически вы можете быть в порядке. Но не рассчитывайте на это.
Нет гарантии realloc
будет возвращать то же местоположение, период.
realloc
не требуется оставлять блок на месте, даже если он будет соответствовать, и на самом деле самая простая реализация заглушки является примером, где это может не быть:
malloc
: вызов sbrk
.realloc
: вызов malloc
и memcpy
.free
: no-op.Это может показаться смешным, но иногда для встроенных систем реализация, как я уже описал, на самом деле является оптимальной.
Мне кажется, что все текущие ответы (во время этого ответа) не относятся к какому-либо стандарту документа.
Для С++ я буду ссылаться на Рабочий черновик, Стандарт для языка программирования С++, Номер документа: 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 возвращает указатель на новый объект (, который может иметь то же значение, что и указатель на старый объект), или нулевое значение указатель, если новый объект не может быть выделен.
Я не являюсь носителем английского языка, поэтому вам нужно интерпретировать значение "возможно".
В Windows C-Runtime захватывает кучу, а затем выделяет память из этой кучи. Таким образом, ОС не будет знать об отдельных распределениях памяти и, таким образом, не будет перемещать вещи.