c - realloc 失败的可能性有多大?

标签 c memory-management realloc

是不是像malloc那样用完空闲内存会失败还是有其他原因?

最佳答案

任何分配函数(mallocrealloccalloc,以及在 POSIX 上,posix_memalign)都可以由于以下任何原因以及可能的其他原因而失败:

  • 您已经用完了整个虚拟地址空间,或者至少是它的可用部分。在 32 位机器上,只有 4GB 的地址,并且可能保留 1GB 左右供操作系统内核使用。即使您的机器有 16GB 的物理内存,单个进程也不能使用超过其地址的内存。
  • 您还没有用完您的虚拟地址空间,但您的虚拟地址空间已经严重碎片化,以致没有所请求大小的连续地址范围可用。如果您成功分配 6 512MB block ,每隔一个释放一个,然后尝试分配一个 1GB block ,这可能会发生(在 32 位机器上)。当然,还有许多其他内存较小的示例。
  • 你的机器已经用完了物理内存,这可能是因为你自己的程序已经用完了它,或者是因为机器上运行的其他程序已经用完了它。某些系统(默认配置中的 Linux)会overcommit,这意味着 malloc 在这种情况下不会失败,但操作系统稍后会在它找到时杀死一个或多个程序确实没有足够的物理内存可以四处走动。但是在健壮的系统上(包括禁用了过度使用的 Linux),如果没有剩余的物理内存,malloc 将会失败。

请注意,严格来说,分配函数在任何时候都可以因任何原因失败。最大限度地减少失败是一个实现质量问题。 realloc 也有可能失败,即使减少 对象的大小也是如此;这可能发生在按大小严格隔离分配的实现中。当然,在这种情况下,您可以简单地继续使用旧的(更大的)对象。

关于c - realloc 失败的可能性有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925562/

相关文章:

c - 从文件读取未知数量的 int 到链表

C 光标问题

c++ - for 循环中的动态数组分配会引发错误

C Realloc 导致段错误

c - 无效的 realloc/realloc 返回 NULL

c - 使用 valgrind 修复内存泄漏

总积点计算

c - C中的就地字符串反转

c - 为什么我的程序不会用 printf(); 显示每个元素?

C++ 按值传递结构或对象