假设进程中有足够的虚拟内存地址。
考虑到 64 位系统几乎有无限的虚拟地址,如果操作系统内存池中仍有可用的物理内存空间,我们是否可以假设内存分配失败的可能性为零?
最佳答案
这取决于。您可以限制(例如在 Linux 上使用 setrlimit(2))一个进程以避免使用所有资源,并且有很好的理由来设置这样的限制(例如避免错误的程序吃掉所有资源,将一些资源留给其他更重要的进程) .
因此,一个行为良好的程序应该始终测试内存分配(例如 malloc(3) 或 operator new
两者通常都基于较低级别的系统调用,如 mmap(2) .. .).当然,资源不是无限的(最多物理 RAM + 交换空间)。
通常,内存耗尽时唯一要做的就是中止程序并显示一条友好的消息(系统管理员可以理解)。做更多花哨的事情要困难得多,但也是可能的(并且在服务器程序中是必需的,因为你想继续为其他请求提供服务......)。
因此,您应该用 C 编写:
void* p = malloc(somesize);
if (!p) { perror("malloc"); exit(EXIT_FAILURE); };
如果您害怕通过 atexit(3) 注册的终止符,您可以使用 _exit
或 abort
执行 malloc
... 但我不会打扰。
通常,出于历史原因,执行上述操作的例程称为 xmalloc
。
在 C++ 中 operator new可能会因抛出 std::bad_alloc 而失败异常(或者如果您使用 new(std::nothrow)
,则通过提供 nullptr
,更多信息请参见 std::nothrow)。
了解更多关于 memory overcommit 的信息在 Linux 上,virtual memory , 以及 Joachim Pileborg评论,memory fragmentation .了解 garbage collection .
关于c++ - 在现代 64 位系统上,什么会导致内存分配失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19948670/