在现代64位系统上,什么可能导致内存分配失败?

时间:2013-11-13 08:17:45

标签: c++ c memory-management 64-bit

假设进程中有足够的虚拟内存地址。

考虑到64位系统具有几乎无限的虚拟地址,并且如果OS内存池中仍有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零?

1 个答案:

答案 0 :(得分:6)

这取决于。您可以限制(例如在Linux上使用setrlimit(2))避免使用所有资源的过程,并且有充分的理由来设置这些限制(例如,避免使用错误的程序来占用所有资源,将一些资源留给其他更重要的资源进程)。

因此,一个表现良好的程序应该总是测试内存分配(例如malloc(3)operator new,这些都经常基于mmap(2)等较低级别的系统调用。 )。当然,资源不是无限的(最多物理RAM +交换空间)。

通常,在内存耗尽方面唯一要做的就是用一个好消息中止程序(sysadmins可以理解)。做更多花哨的事情要困难得多,但可能(并且在服务器程序中需要,因为你想继续提供其他请求......)。

因此,你应该用C:

 void* p = malloc(somesize);
 if (!p) { perror("malloc"); exit(EXIT_FAILURE); };

如果你害怕通过atexit(3) _exit注册的终结者,你可以使用abortmalloc ......但我不会打扰。< / SUP>

由于历史原因,执行上述操作的例程通常称为xmalloc

在C ++中,operator new可能会因为std::bad_alloc例外而失败(或者如果您使用nullptr则提供new(std::nothrow),请参阅std::nothrow了解更多信息)。

详细了解Linux上的memory overcommitvirtual memory以及Joachim Pileborg评论的memory fragmentation。阅读garbage collection