Как работает realloc() ?? C++

Я использую realloc и задался вопросом: Эта функция создает новый блок памяти и копирует туда содержимое старого блока, а после возвращает его?? Или она в прямом смысле изменяет блок памяти? Очищает ли она старый блок?

Вызовет ли это утечку памяти:

T* ndat = (T*)malloc(sizeof(T) * 5);
T* checklink = (T*)realloc(ndat, sizeof(T*) * 7);
if (checklink == nullptr)
{
  throw 893242428;
}
ndat = checklink;

Ответы (1 шт):

Автор решения: KoVadim

Оба варианта правильные. https://stackoverflow.com/questions/10864593/implementation-of-realloc-in-c

Функция realloc знает внутреннее устройство менеджера памяти (как и malloc/free) и знает о том, что malloc обычно выделяет чуточку больше памяти, чем просят (сколько именно - личное дело менеджера памяти).

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

Если же памяти не хватает, то выделяет новый блок, копирует туда текущее содержимое, удаляет переданный блок и возвращает указатель на новый блок памяти.

Но это все - обычное ожидаемое поведение. Но никто не мешает менеджеру памяти быть так устроенным, что каждый realloc будет всегда возвращать новый кусок памяти или в том случае, если памяти не хватает в текущем блоке, возвращать ошибку. Для какой то задачи это может быть оправдано (копирование памяти - не быстрый процесс, а если у нас каждый такт на вес золота...)

→ Ссылка