如果新的尺寸更小,可以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 ?
基本上,OS可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?
http://opengroup.org/onlinepubs/007908775/xsh/realloc.html
成功完成后,大小不等于0,realloc()返回指向(可能已移动)分配空间的指针。
不,不保证
无法保证realloc
将返回相同的位置,期间。
使用realloc
,你绝对无法保证记忆在后面的位置。 我相信libc的默认malloc只会勉强复制内存,所以实际上你可能没问题。 但不要指望它。
即使它适合,也不需要realloc
将块保留在适当的位置,事实上最简单的存根实现是一个例子,它可能不是:
-
malloc
:打电话给sbrk
。 -
realloc
:调用malloc
和memcpy
。 -
free
:无操作。
这可能听起来很荒谬,但有时对于嵌入式系统,我刚才描述的实现实际上是最优的。
在我看来,所有当前答案(在本答复时)都没有提到任何标准文件。
对于C ++,我将参考工作草案,编程语言C ++标准 ,文档编号:N3337,日期:2012-01-16,修订:N3291 ,根据https://isocpp.org/std/the-standard ,是与非免费官方C ++ 11标准文档最接近的免费文档; 在这里我们找到20.6.13 C库 :
2内容与标准C库标题相同,但有以下更改:[在我看来,列出的更改与问题无关]。
所以现在我们必须参考C标准。
根据https://stackoverflow.com/a/83763/15485 ,最接近非免费官方C11标准文件的免费文件是编程语言 – C ,N1570委员会草案 – 2011年4月12日ISO / IEC 9899:201x ; 这里我们在7.22.3.5找到realloc函数 :
4 realloc函数返回指向新对象的指针( 可能与指向旧对象的指针具有相同的值 ),如果无法分配新对象,则返回空指针。
我不是母语为英语的人,所以由您来解释“可能有”的含义。
在Windows上,C-Runtime抓取一个堆,然后从该堆分配内存。 因此操作系统不会知道单个内存分配,因此不会移动。