假设我正在尝试在 C99 中编写 malloc()
的检查版本 - 没什么特别的,一个简单的包装器,如果 malloc()
返回 NULL
将向 stderr
打印一条错误消息并退出。有点像
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;
}
其中一个问题是 fprintf - 它可能会尝试自行分配内存,并且由于我们已经用完了内存,所以会失败。
有什么方法可以在内存分配失败后可靠地记录错误消息?或者是否有更好的方法来编写已检查的 malloc()
?与编译器无关的解决方案是非常受欢迎的。
最佳答案
说实话,我觉得你太偏执了。您当前的解决方案看起来不错。 fprintf()
没有理由因 ENOMEM
而失败。它只是转身并向 stderr
(2) 的文件描述符发出 write()
调用。它没有理由分配任何内存。
当然,您始终可以尝试使用直接 write()
进行日志记录,如下所示:
static const char oom[] = "Out of memory!\n";
write(2, oom, sizeof(oom));
但同样,这可能有点矫枉过正。
此外,您不必担心每个库调用在内存分配方面的作用。使用经过检查的 malloc()
不能替代代码中其他地方的良好错误检查。
关于c - 记录内存分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169941/