изменение размера буфера с помощью realloc - PullRequest
4 голосов
/ 25 апреля 2009

Если указанная область была перемещена, бесплатно (ptr) сделано.

Можете ли вы объяснить вышеупомянутую строку о realloc()? Эта строка из справочной страницы для calloc, malloc, realloc и free.

Ответы [ 3 ]

15 голосов
/ 25 апреля 2009

Я думаю, это объясняет это лучше:

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

Ссылка взята из realloc в C

11 голосов
/ 26 апреля 2009

Допустим, у вас есть следующие макеты кучи. Это упрощенный распределитель памяти, в котором управляющая информация

не занимает место в куче.
Addr       A                   B
     +------------+      +------------+
1000 | your space |      | your space |
     +------------+      +------------+
2000 | free space |      | used space |          
     |            |      +------------+
3000 |            |      | free space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

В обеих ситуациях у вас есть 1000 байтов, выделенных по адресу 1000. Однако в ситуации B за этим сразу следует память, выделенная для какой-то другой цели.

Давайте рассмотрим, что происходит, когда вы хотите перераспределить вашу память до 2000 байт.

В ситуации A это просто, это просто расширяет ваше распределение согласно диаграмме ниже.

Но в ситуации B это не так просто. Память, следующая сразу за вашим блоком, используется, поэтому недостаточно места, чтобы просто расширить выделение, и вам нужна последовательная память. Вот конечная позиция для двух ситуаций:

Addr       A                   B
     +------------+      +------------+
1000 | your space |      | free space |
     |            |      +------------+
2000 |            |      | used space |
     +------------+      +------------+
3000 | free space |      | your space |
     |            |      |            |
4000 |            |      |            |
     +------------+      +------------+

Для ситуации B распределитель находит блок (на 3000), который достаточно достаточно большой для вашего желаемого расширения, и копирует в него содержимое вашего текущего блока (на 1000). Затем он дает вам адрес этого нового блока и освобождает старый блок , поскольку он вам больше не нужен. Вот что означает фраза в вашем вопросе.

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

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

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

...