2

假设我正在尝试malloc()在 C99 中编写一个检查版本 - 没什么花哨的,一个简单的包装器,如果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()?编译器不可知的解决方案是非常受欢迎的。

4

1 回答 1

1

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

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

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

但同样,这可能是矫枉过正。

此外,您不必担心每个库调用在内存分配方面的作用。使用检查malloc()并不能替代代码中其他地方的良好错误检查。

于 2013-03-02T02:23:52.960 回答