内存不足时如何输出一些内容?
我有一组自定义的 malloc[、realloc 和 calloc] 和 free 函数。目前,该项目仅将它们用作函数普通版本的包装器。这些包装器函数会终止程序并应提供输出以指示错误。
目前输出错误消息的函数如下所示:
#ifdef __linux__
void memory_error() {
if (errno == ENOMEM)
printf("%s\n", "Out of memory or memory is limited. Fatal error. The program needs to terminate.");
else
printf("%s\n", "Memory allocation failed. Fatal error. The program needs to terminate.");
}
#else
void memory_error() {
printf("%s\n", "Memory allocation failed, likely due to being out of "
"memory or memory being limited for this program. "
"Fatal error. The program needs to terminate.");
}
#endif
问题是printf()
有时会分配内存,如果内存不足,就会失败。会fwrite()
分配内存吗?如果是这样,是否有一个可移植的(因此没有写入系统调用)选项来输出某些内容而无需分配更多内存?
到目前为止,作为 Unix 系统的有效解决方案,我可以这样做:
#ifdef __unix__
#define write_str_no_alloc(str) write(STDERR_FILENO, str, sizeof(str))
#else
#define write_str_no_alloc(str) ???
#endif
我缺少适用于 Windows 的解决方案。我更希望有一个适用于两者的通用解决方案,但这对我来说是可行的。
在 POSIX 系统上,该
write
函数直接调用write
系统调用,因此不会发生内存分配。Windows 有一个
_write
函数,它是 POSIX 兼容层的一部分,并且也有文档记录可以直接调用操作系统而无需缓冲:因此你可以这样做:
请注意,这要求参数是字符串文字或数组,否则
sizeof
不会给出所需的结果。您可以编写自己的
safe_printf()
函数,该函数永远不会调用malloc()
。来自我的问答:C 中的哪些打印调用永远不会malloc()
在后台调用?:只需将
write()
我的safe_print()
函数替换为@dbush 的write_str_no_alloc()
函数,它便可在 Windows 和 Linux 中运行。或者,使用 Windows 的WriteFile()
函数,如@Some 程序员所说。我只想保留一个地方来维护此代码,因此请在我的答案中获取代码。
用法与 完全相同
printf()
。示例(根据我的其他回答修改而来):
如果最终选择是
printf()
(输出到stdout
),请务必跟进fflush(stdout)
以确保它可以输出。特别是在错误情况下以及有关刷新的许多规则中,最好将此消息发送出去。