是不是像malloc
那样用完空闲内存会失败还是有其他原因?
最佳答案
任何分配函数(malloc
、realloc
、calloc
,以及在 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/