在我的 C 程序中,我尝试使用 malloc() 函数分配一些内存,如下所示:
char *buf = (char *)malloc(size);
但问题是 malloc() 总是返回非 NULL 指针。即使我尝试分配大量(size 为 1E+13)内存,它也会返回有效的 buf 指针。当然是在那个程序崩溃之后。
但是,如果返回的 buf 值不为 NULL,我如何检测到请求的内存量过大且不可用?
编辑:
在评论中我看到我的问题可能不清楚。所以这是一个更扩展的示例:
unsigned long size = very_large_calculated_value;
char *buf = (char *)malloc(size);
if (buf == NULL) i_know_it_fails;
...
但 Xcode 运行此代码,无论请求的 size 是什么,buf 都永远不会为 NULL。所以,很快程序就会崩溃。如果 buf 不为 NULL,但显然无法使用,我如何检测内存分配失败?
编辑:
对于那些将问题标记为重复的人: “如何检测内存分配失败?”这个问题没有答案,因为“更改操作系统中的某些设置”之类的解决方案不是答案 - 我要求 C 代码检测内存分配错误,或类似的东西“不可能以编程方式制作”。
最佳答案
无法预测内存分配失败。唯一的方法是检查 malloc()
的返回值是否为空指针。
看来你的问题真的是关于内存的overcommit由内核完成。使用它内核永远不会返回空指针。默认是总是过度使用。所以要在类似 Linux 的系统上禁用它:
echo 2 > /proc/sys/vm/overcommit_memory
或者你可以使用 sysctl
做同样的事情:
sysctl vm.overcommit_memory=2
两者是等价的。
值 2
是为了确保 malloc
在请求的内存超过可用物理内存(加上交换空间)的情况下返回空指针。
关于c - 如何检测 malloc() 函数将失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947663/