c++ - 在现代 64 位系统上,什么会导致内存分配失败?

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

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

考虑到 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) 注册的终止符,您可以使用 _exitabort执行 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/

相关文章:

c++ - 用于 Windows 和 OpenGL 的 Qt C++ 库

c - 如何在C中使用递归函数打印从1到N的数字

c - 将两个大于 255 的数字相乘

c - C中struct的动态内存分配

c++ - 涉及填充时堆的 MSVC 初始化

html - 如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML

c++ - 是什么导致我的 2D Perlin 噪声中出现这些伪像?

c++ - va_start(等)是可重入的吗?

c - 尽管选项正确,静态链接仍不适用于 C++/CLI(未解析的外部符号)

c - 为 C 中的结构分配内存时,哪个是正确的