Как работает 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 шт):
Оба варианта правильные. https://stackoverflow.com/questions/10864593/implementation-of-realloc-in-c
Функция realloc знает внутреннее устройство менеджера памяти (как и malloc/free) и знает о том, что malloc обычно выделяет чуточку больше памяти, чем просят (сколько именно - личное дело менеджера памяти).
Если памяти в текущем выделенном блоке хватает, то realloc обновляет данные во внутренних структурах (не обязано, но если работает поиск утечек памяти и выхода за границы, то нужно) и возвращает переданный указатель.
Если же памяти не хватает, то выделяет новый блок, копирует туда текущее содержимое, удаляет переданный блок и возвращает указатель на новый блок памяти.
Но это все - обычное ожидаемое поведение. Но никто не мешает менеджеру памяти быть так устроенным, что каждый realloc будет всегда возвращать новый кусок памяти или в том случае, если памяти не хватает в текущем блоке, возвращать ошибку. Для какой то задачи это может быть оправдано (копирование памяти - не быстрый процесс, а если у нас каждый такт на вес золота...)