如何检测malloc()函数是否会失败?

时间:2015-08-11 16:55:34

标签: c xcode

在我的C程序中,我试图用malloc()函数分配一些内存,如下所示:

char *buf = (char *)malloc(size);

但问题是malloc()总是返回非NULL指针。即使我尝试分配大量(大小是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运行此代码, buf 永远不会为NULL size 。所以,很快程序崩溃了。如果 buf 不是NULL,但是显然不可用,我该如何检测内存分配失败?

修改

对于将问题标记为重复的人: 问题没有答案"如何检测内存分配失败?",因为解决方案类似于更改操作系统中的某些设置"不是答案 - 我要求C代码检测内存分配错误,或类似"它不可能以编程方式进行#34;。

4 个答案:

答案 0 :(得分:3)

无法预测内存分配失败。唯一的方法是检查malloc()的返回值是否为空指针。

看来你的问题实际上是内核完成的内存overcommit。使用哪个内核永远不会返回空指针。默认为始终过度使用。所以要在类似Linux的系统上禁用它:

echo 2 > /proc/sys/vm/overcommit_memory

或者你也可以使用sysctl

来做同样的事情
sysctl vm.overcommit_memory=2

两者都是等价的。

2是为了确保malloc在请求的内存超过可用物理内存(加上交换空间)的情况下返回空指针。

答案 1 :(得分:2)

  

malloc()始终返回非NULL指针

这不太正确。

如果malloc()失败,它将返回NULL。您需要检查malloc()(指针)的返回值是否为NULL,以确保malloc()成功。

引用手册页,(强调我的)

  

malloc()calloc()函数返回指向已分配内存的指针,该内存适合于任何类型的变量。 出错时,这些函数返回NULL。 [...]

请注意; [发表评论]

如果您正在讨论malloc()用于返回指针的乐观分配技术,那么在这种情况下,没有标准方式来检查或者预测未来的失败,以防malloc()返回非NULL指针。如果您想确定内存的可用性,可以考虑改用calloc()

答案 2 :(得分:2)

扩展BlueMoon的答案,以下是man page for malloc对过度评论的看法:

  

BUGS

     

默认情况下,Linux遵循乐观的内存分配   战略。这意味着当malloc()在那里返回非NULL时   并不能保证内存确实可用。这是一个   非常糟糕的bug。如果事实证明系统已经用完了   内存,一个或多个进程将被臭名昭着的OOM杀死   杀手。如果Linux在它的情况下使用   不太可能突然失去一些随机挑选   进程,而且内核版本是足够的   最近,人们可以使用a来关闭这种过度使用行为   命令就好             # echo 2 > /proc/sys/vm/overcommit_memory
  另请参阅内核文档目录,文件vm/overcommit-accountingsysctl/vm.txt

答案 3 :(得分:1)

经过多次测试后,它似乎是一个Xcode调试问题。 结果取决于是否使用断点以及它们在代码中的位置。

通常,如果要删除所有断点,则代码将按原样运行,没有任何问题。但是如果插入了一些断点(它们在代码中的位置的影响对我来说还不清楚)那么Xcode会变得不稳定并在内存分配函数之后崩溃。