使用realloc调整缓冲区大小

时间:2009-04-25 18:01:14

标签: c realloc

  

如果指向的区域被移动,a   免费(ptr)完成。

您能解释一下realloc()的上述内容吗?这一行来自calloc,malloc,realloc和free的手册页。

3 个答案:

答案 0 :(得分:15)

我认为这更好地解释了它:

  

如果不存在足够的空间   扩展其中的当前块   当前的位置,一个新的块   大小的大小被分配,和   现有数据是从旧的复制   阻止到新的开始   块。旧块被释放了   function返回指向new的指针   块。

摘自realloc in C

答案 1 :(得分:11)

假设您有以下堆布局。这是一个简化的内存分配器,其中堆中没有空间被控制信息占用

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 :(得分:2)

你不能总是在原地增加记忆区域。堆中可能没有空间。因此,它不会增长它,而是分配一个全新的内存块并释放旧内存。