2013-03-02 95 views
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()?编译器不可知的解决方案是非常受欢迎的。

回答

1

说实话,我觉得你太偏执了。您当前的解决方案看起来很好没有理由fprintf()应该与ENOMEM一起失败。它只是要回过头来,并发出write()调用stderr(2)的文件描述符。它没有理由分配任何内存。

当然,你总是可以尝试直接write()小号记录,像这样:

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

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

此外,您不应该担心每个库调用的内存分配情况。使用选中的malloc()不能替代代码中其他位置的良好错误检查。