изменение размера буфера с помощью realloc

StackOverflow https://stackoverflow.com/questions/789413

  •  16-09-2019
  •  | 
  •  

Вопрос

Если область, на которую указано, была перемещена, выполняется освобождение (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).Затем он выдает вам адрес этого нового блока и освобождает старый блок поскольку вам это больше не требуется. Вот что означает фраза в вашем вопросе.

Это действие по перемещению буферов зависит от стратегии распределения памяти, но, как правило, буфер не будет перемещен (это часто дорого, поскольку требует массового копирования в память), если либо:

  • после него остается свободное пространство, которое, наряду с текущим пространством, может удовлетворить перераспределению;или
  • вы уменьшаете размер.

Вы не всегда можете просто увеличить область памяти на месте.В куче может не хватить места.Таким образом, вместо того, чтобы увеличивать его, он выделит совершенно новый блок памяти и освободит старую память.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top