c - 如何检测 malloc() 函数将失败?

标签 c xcode malloc dynamic-memory-allocation

在我的 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/

相关文章:

c - 在终端中使用 C 时,哈希符号注释掉代码

xcode - 位置无关可执行文件的正确 Xcode 设置是什么

ios - 更新 xcode 时如何更改提示中的 Apple ID

c++ - 使用分段寻址模式的 16 位系统上 `size_t` 、 `uintptr_t` 、 `intptr_t` 和 `ptrdiff_t` 类型的实际大小是多少?

c - 什么功能是用C语言替换字符串中的子字符串?

c++ - 为什么 C++ 链接器不提示缺少这些函数的定义?

ios - <CATransformLayer : 0x14fea3710> - changing property masksToBounds in transform-only layer, 将无效

C++-为类的成员变量释放动态分配的内存会出现错误

c - 段错误(循环中的 Malloc/Free)

c - 免费动态分配的内存