如果没有连续的内存空间,realloc会怎么做?

realloc用于动态重新分配内存。

假设我使用malloc函数分配了7个字节,现在我想将它扩展到30个字节。

如果内存中没有30个字节的顺序(连续单行)空间,后台会发生什么?

是否有任何错误或内存将被分配?

realloc在幕后工作大致如下:

  • 如果当前块后面有足够的可用空间来满足请求,则扩展当前块并返回指向块开头的指针。
  • 否则,如果其他地方有足够大的空闲块,则分配该块,复制旧块中的数据,释放旧块并返回指向新块开头的指针
  • 否则返回NULL报告失败。

因此,您可以通过测试NULL来测试失败,但请注意,您不要过早覆盖旧指针:

 int* p = malloc(x); /* ... */ p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */ /* Correct way: */ { int* temp = realloc(p, y); if (NULL == temp) { /* Handle error; p is still valid */ } else { /* p now possibly points to deallocated memory. Overwrite it with the pointer to the new block, to start using that */ p = temp; } } 

realloc只有在它能够返回连续的(你的话中的“顺序”)内存块时才会成功。 如果不存在这样的块,则它将返回NULL

从手册页 :

realloc()返回一个指向新分配的内存的指针,该内存适用于任何类型的变量,可能与ptr不同,如果请求失败,则返回NULL。

换句话说,要检测故障,只需检查结果是否为NULL。

编辑:如评论中所述,如果调用失败,则不会释放原始内存。

一般来说,这取决于实施。 在x86(-64)Linux上,我相信标准的doug lea malloc算法总是会分配最小的标准x86页面(4096字节),因此对于上面描述的场景,它只会重置边界以容纳额外的字节。 比如说,重新分配7bytes的缓冲区到PAGE_SIZE + 1,我相信它会尝试分配下一个连续的页面(如果可用)。

如果你在Linux上开发,值得阅读以下内容:

默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL时,无法保证内存确实可用。 这是一个非常糟糕的错误。 如果事实certificate系统内存不足,那么一个或多个进程将被臭名昭着的OOM杀手杀死。 如果Linux在不太可能突然丢失一些随机选择的进程的情况下使用,而且内核版本足够新,可以使用如下命令关闭这种过度使用的行为:

 # echo 2 > /proc/sys/vm/overcommit_memory 

另请参阅内核文档目录,文件vm / overcommit-accounting和sysctl / vm.txt。

FreeBSD和Mac OS X都有reallocf()函数,当无法分配请求的内存时,它将释放传递的指针(参见man realloc)。