Realloc перезаписывает старое содержание?
Вопрос
Когда мы перераспределяем память через realloc()
, предыдущие содержимое переоценено? Я пытаюсь сделать программу, которая перераспределяет память каждый раз, когда мы вводим в нее данные.
Пожалуйста, расскажите мне о распределении памяти через Realloc, это компилятор зависит, например?
Решение
Не беспокойтесь о старом содержании.
Правильный способ использования 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
, Ответ да (до минимума старого размера и нового размера).