4

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

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

4

1 回答 1

6

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

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

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

因此,您应该用 C 编写:

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

您可以使用_exit,或者abort如果您害怕通过 atexit(3) 注册的终结器...malloc我不会打扰。

xmalloc通常,出于历史原因,需要执行上述操作。

在 C++ 中,运算符 new可能会因抛出std::bad_alloc异常而失败(或者nullptr如果您使用new(std::nothrow),请参阅std::nothrow以获取更多信息)。

了解有关Linux 上的内存过量使用、虚拟内存以及Joachim Pileborg评论的内存碎片的更多信息。阅读垃圾收集

于 2013-11-13T08:20:48.460 回答