изменение размера буфера с помощью realloc
Вопрос
Если область, на которую указано, была перемещена, выполняется освобождение (ptr).
Не могли бы вы, пожалуйста, объяснить приведенную выше строку о realloc()
?Эта строка взята со справочной страницы для calloc, malloc, realloc и free.
Решение
Я думаю, что это объясняет это лучше:
Если не существует достаточного пространства для развертывания текущего блока в его текущем местоположении, выделяется новый блок соответствующего размера, и существующие данные копируются из старого блока в начало нового блок.Старый блок освобождается, и функция возвращает указатель на новый блок.
Ссылка взята из перераспределение в C
Другие советы
Допустим, у вас есть следующие макеты кучи.Это упрощенный распределитель памяти, в котором управляющая информация не занимает места в куче
Addr A B
+------------+ +------------+
1000 | your space | | your space |
+------------+ +------------+
2000 | free space | | used space |
| | +------------+
3000 | | | free space |
| | | |
4000 | | | |
+------------+ +------------+
В обеих ситуациях у вас есть 1000 байт, выделенных по адресу 1000.Однако в ситуации B за этим сразу же следует память, выделенная для какой-то другой цели.
Давайте рассмотрим, что происходит, когда вы хотите перераспределить свою память до 2000 байт.
В ситуации А это несложно, это просто расширяет ваше распределение в соответствии с приведенной ниже диаграммой.
Но в ситуации Б это не так просто.Память, непосредственно следующая за вашим блоком, используется, поэтому недостаточно места, чтобы просто расширить ваше выделение, и вы потребность последовательное запоминание.Вот конечная позиция для двух ситуаций:
Addr A B
+------------+ +------------+
1000 | your space | | free space |
| | +------------+
2000 | | | used space |
+------------+ +------------+
3000 | free space | | your space |
| | | |
4000 | | | |
+------------+ +------------+
Для ситуации B распределитель находит блок (на уровне 3000), который является достаточно большой для желаемого расширения и копирует в него содержимое вашего текущего блока (размером 1000).Затем он выдает вам адрес этого нового блока и освобождает старый блок поскольку вам это больше не требуется. Вот что означает фраза в вашем вопросе.
Это действие по перемещению буферов зависит от стратегии распределения памяти, но, как правило, буфер не будет перемещен (это часто дорого, поскольку требует массового копирования в память), если либо:
- после него остается свободное пространство, которое, наряду с текущим пространством, может удовлетворить перераспределению;или
- вы уменьшаете размер.
Вы не всегда можете просто увеличить область памяти на месте.В куче может не хватить места.Таким образом, вместо того, чтобы увеличивать его, он выделит совершенно новый блок памяти и освободит старую память.