假设我正在尝试在C99中编写malloc()
的已检查版本 - 没什么特别的,一个简单的包装器,如果malloc()
返回NULL
将会向{打印错误消息{1}}并退出。像
stderr
其中一个问题是fprintf - 它可能会尝试自己分配内存,因为我们内存不足已经无法正常失败。
在内存分配失败后,有没有办法可靠地记录错误消息?或者是否有更好的方法来编写已检查的 void* checked_malloc(size_t size) {
void* ptr = malloc(size);
if (ptr == NULL) {
fprintf(stderr, "Failed to allocate %zd bytes\n", size);
exit(1);
}
return ptr;
}
?编译器不可知解决方案是非常优选的。
答案 0 :(得分:1)
说实话,我觉得你太偏执了。您当前的解决方案看起fprintf()
没有理由ENOMEM
失败。它只是转而对write()
(2)的文件描述符发出stderr
次调用。它没有理由分配任何内存。
当然,您可以尝试使用直接write()
进行日志记录,如下所示:
static const char oom[] = "Out of memory!\n";
write(2, oom, sizeof(oom));
但同样,这可能有点过头了。
此外,您不必担心每个库调用对内存分配的影响。使用已检查的malloc()
不能替代代码中其他位置的错误检查。