记录内存分配错误

时间:2013-03-02 02:15:22

标签: c memory-management malloc

假设我正在尝试在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; } ?编译器不可知解决方案是非常优选的。

1 个答案:

答案 0 :(得分:1)

说实话,我觉得你太偏执了。您当前的解决方案看起fprintf()没有理由ENOMEM失败。它只是转而对write()(2)的文件描述符发出stderr次调用。它没有理由分配任何内存。

当然,您可以尝试使用直接write()进行日志记录,如下所示:

static const char oom[] = "Out of memory!\n";
write(2, oom, sizeof(oom));

但同样,这可能有点过头了。

此外,您不必担心每个库调用对内存分配的影响。使用已检查的malloc()不能替代代码中其他位置的错误检查。