假设进程中有足够的虚拟内存地址。
考虑到64位系统具有几乎无限的虚拟地址,并且如果OS内存池中仍有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零?
答案 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
注册的终结者,你可以使用abort
或malloc
......但我不会打扰。< / SUP>
由于历史原因,执行上述操作的例程通常称为xmalloc
。
在C ++中,operator new可能会因为std::bad_alloc例外而失败(或者如果您使用nullptr
则提供new(std::nothrow)
,请参阅std::nothrow了解更多信息)。
详细了解Linux上的memory overcommit,virtual memory以及Joachim Pileborg评论的memory fragmentation。阅读garbage collection。