我正在试验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。 代码崩溃并说
,而不是返回NULLmalloc: *** 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的一些系统错误消息阻碍了预期的输出。请参阅下文,了解如何避免这种情况。
答案 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.