Перезаписывает ли realloc старое содержимое?
когда мы перераспределяем память через realloc()
, предыдущее содержимое написано? Я пытаюсь создать программу, которая перераспределяет память каждый раз, когда мы вводим в нее данные.
пожалуйста, расскажите мне о выделении памяти через realloc, зависит ли это от компилятора, например?
4 ответов
Не беспокойтесь о старом содержимом.
правильный способ использовать realloc
использовать определенный указатель для перераспределения, проверить этот указатель и, если все получилось хорошо, изменить старый указатель
int *oldpointer = malloc(100);
/* ... */
int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
/* problems!!!! */
/* tell the user to stop playing DOOM and retry */
/* or free(oldpointer) and abort, or whatever */
} else {
/* everything ok */
/* `newpointer` now points to a new memory block with the contents of oldpointer */
/* `oldpointer` points to an invalid address */
oldpointer = newpointer;
/* oldpointer points to the correct address */
/* the contents at oldpointer have been copied while realloc did its thing */
/* if the new size is smaller than the old size, some data was lost */
}
/* ... */
/* don't forget to `free(oldpointer);` at some time */
Он растет уже выделенной памяти без перезаписи существующего контента, или (если он не может расти) он выделяет новую большую память в другом месте и копирует существующее содержимое из предыдущей памяти в новую память.
вы должны программировать так, как если бы старый указатель был перезаписан, да. Старая память больше не выделяется, поэтому может быть повторно выделена другой частью вашей программы (или системным потоком, например) и записана в любое время после вызова realloc.
новая память всегда будет содержать те же данные, которые присутствовали в старой памяти, хотя (при необходимости она копируется для вас), но только до размера старого блока, любое дополнительное пространство, выделенное в конце, будет неинициализированный.
Если вам нужна копия, сделайте новый malloc и используйте memcpy.
реализация-мудрый, когда вы вызываете realloc в увеличить размер, одна из этих вещей может произойти:
- выделяется новый блок и копируется содержимое старой памяти, освобождается старый блок, возвращается новый указатель.
- если область после блока не выделена, существующий блок может быть расширен и тот же указатель возвращенный.
поскольку у вас нет способа узнать, что произошло, или даже если используется совершенно другая реализация, чем предложенная выше, вы всегда должны кодировать в соответствии со спецификацией realloc, которая заключается в том, что вы больше не должны использовать старый указатель, и вы должны использовать новый.
трудно сказать, что вы спрашиваете, но если вы спрашиваете, можете ли вы прочитать "старое содержимое" по старому адресу, переданному realloc
ответ нет. В некоторых случаях, вы можете найти часть или все содержимое есть, но если realloc
вернул тот же указатель, который вы передали ему, любое использование старого указателя неопределенное поведение.
Если вы просто спрашиваете, будет ли сохранено старое содержимое по новому адресу, возвращенному realloc
, ответ да (до минимума старого размера и нового размера).