在我的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;。
答案 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-accounting
和sysctl/vm.txt
。
答案 3 :(得分:1)
经过多次测试后,它似乎是一个Xcode调试问题。 结果取决于是否使用断点以及它们在代码中的位置。
通常,如果要删除所有断点,则代码将按原样运行,没有任何问题。但是如果插入了一些断点(它们在代码中的位置的影响对我来说还不清楚)那么Xcode会变得不稳定并在内存分配函数之后崩溃。