如果新的尺寸更小,可以realloc移动指针吗?

spi*_*rov 11 c realloc

我想知道当使用较小(非零)大小调用realloc时,C或C++标准是否保证指针不会更改:

size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?
Run Code Online (Sandbox Code Playgroud)

基本上,操作系统可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?

Jef*_*rth 17

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

在成功完成且大小不等于0时,realloc()返回指向(可能已移动)已分配空间的指针.

不,不保证


Jim*_*ski 7

没有保证realloc将返回相同的位置,期间.

  • @RoG 是的,确实如此。不指定保证就意味着没有保证。 (2认同)

zen*_*azn 6

有了realloc,你绝对不能保证记忆在后面的位置.我相信libc的默认malloc只会勉强复制内存,所以实际上你可能没问题.但不要指望它.


R..*_*R.. 5

realloc不需要将块保留在适当的位置,即使它适合,事实上,最简单的存根实现是一个可能不适合的示例:

  • malloc: 称呼sbrk
  • realloc: 打电话mallocmemcpy.
  • free: 无操作。

这听起来可能很荒谬,但有时对于嵌入式系统来说,像我刚刚描述的那样的实现实际上是最佳的实现。

  • 是的。另一个更高级的示例是一种实现,它检查要收缩的块的左侧邻居是否空闲,是否会通过收缩在右侧创建一个重要的空闲块,结果大小是否“足够小” “‘memcpy’并不太昂贵......如果满足正确的条件,则将块移动到新位置以避免碎片。 (2认同)