假设进程中有足够的虚拟内存地址。
考虑到 64 位系统的虚拟地址几乎是无限的,如果操作系统内存池中还有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零?
假设进程中有足够的虚拟内存地址。
考虑到 64 位系统的虚拟地址几乎是无限的,如果操作系统内存池中还有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零?
这取决于。您可以限制(例如,在 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评论的内存碎片的更多信息。阅读垃圾收集。