如果指向的区域被移动,a 免费(ptr)完成。
您能解释一下realloc()
的上述内容吗?这一行来自calloc,malloc,realloc和free的手册页。
答案 0 :(得分:15)
我认为这更好地解释了它:
如果不存在足够的空间 扩展其中的当前块 当前的位置,一个新的块 大小的大小被分配,和 现有数据是从旧的复制 阻止到新的开始 块。旧块被释放了 function返回指向new的指针 块。
答案 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)
你不能总是在原地增加记忆区域。堆中可能没有空间。因此,它不会增长它,而是分配一个全新的内存块并释放旧内存。