使用 realloc 收缩

Posted

技术标签:

【中文标题】使用 realloc 收缩【英文标题】:Shrinking with realloc 【发布时间】:2011-04-16 21:08:54 【问题描述】:

我在this question遇到了这段小代码,很想知道,

当指向的内存空间缩小时,realloc() 函数能否将内存块移动到另一个位置?

int * a = malloc( 10*sizeof(int) );
int * b = realloc( a, 5*sizeof(int) );

如果可能,在什么情况下,我可以期望b 的地址与a 中的地址不同?

【问题讨论】:

【参考方案1】:

realloc 可以在任何呼叫中移动内存。在许多实现中确实如此,收缩只会导致堆中保留大小的变化并且不会移动内存。然而,在针对低碎片优化的堆中,它可能会选择将内存移动到更合适的位置。

不要依赖realloc 将内存保存在同一位置进行任何操作。

【讨论】:

为了消除任何疑问,我实际上在 ios 6 上遇到过这种情况,其中 40K 到 224 字节的重新分配实际上会将内存移动到新位置。

以上是关于使用 realloc 收缩的主要内容,如果未能解决你的问题,请参考以下文章

使用 realloc 是不是安全?

在 C++ 中使用 realloc

realloc 会覆盖旧内容吗?

释放分配的内存:realloc() 与 free()

realloc() 导致程序停止

动态分配内存-realloc