内存分配失败。但为什么会崩溃?或者是吗?

时间:2015-11-05 15:52:36

标签: c memory-management malloc

我正在试验EXEC sp_fkeys 'MyTable',给它越来越大的尺寸,并检查是否重复使用了相同的块:

realloc

正如预期的那样,最终会达到一个尺寸太大且int main ( void ) { char * newstr, * prevstr = NULL; size_t newsize, prevsize = 0; printf ("We play with realloc\n"); while (1) { newsize = prevsize + 1 + prevsize/3; /* add 33% */ newstr = realloc(prevstr, newsize); if (newstr == NULL) { printf ("could not alloc newsize=%zu. Sorry\n", newsize); break; } else { printf ("newsize=%zu successfully alloc'ed\n", newsize); if (newstr == prevstr) { printf ("newstr = prevstr:\tSame block reused\n"); } else { printf ("newstr != prevstr:\tNew block alloc'ed\n"); } prevstr = newstr; prevsize = newsize; } } return (EXIT_SUCCESS); } 无法回答请求的点。根据手册,realloc应该返回realloc并在NULL成功时设置errno = ENOMEM

这不是我在我的机器上运行上述代码时发生的情况,一台带有“Darwin内核版本15.0.0”的Mac。 代码崩溃并说

,而不是返回NULL
malloc: *** mach_vm_map(size=153288611651584) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
could not alloc newsize=153288611651277. Sorry

这是正常的吗?阅读手册页时我不明白的东西?

这对我目前的代码并不重要,但我可以想象我想测试是否可以分配内存而不会有崩溃的情况。有没有一种标准方法可以测试alloc是否可以正常工作而不会有这种崩溃的风险?

神秘解决后添加(参见下面的答案):没有崩溃,只是来自malloc的一些系统错误消息阻碍了预期的输出。请参阅下文,了解如何避免这种情况。

2 个答案:

答案 0 :(得分:15)

正如评论所述,分配失败没有崩溃,只有错误消息。

如果邮件让您烦恼,可以将malloc的日志重定向到/dev/null,将其关闭,如下所示:

export MallocLogFile=/dev/null

设置环境变量之前的输出如下所示:

newstr = prevstr:   Same block reused
a.out(4275,0x7fff7146e000) malloc: *** mach_vm_map(size=153288611651584) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
could not alloc newsize=153288611651277. Sorry

设置变量后,输出如下所示:

newstr = prevstr:   Same block reused
could not alloc newsize=153288611651277. Sorry

注意:这是特定于Mac的。有关调整malloc操作详情的其他环境变量的说明,请参阅documentation

答案 1 :(得分:11)

代码没有崩溃,因为“无法分配newsize = 153288611651277。抱歉”输出发生 - 只打印了一条附加消息。 @Blagovest Buyukliev

附加邮件可能会在stderr而不是stdout上发送。 @Eugene Sh.