【问题标题】:Logging memory allocation errors记录内存分配错误
【发布时间】:2013-03-02 02:15:21
【问题描述】:

假设我正在尝试在 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()?编译器不可知的解决方案是非常受欢迎的。

【问题讨论】:

    标签: c memory-management malloc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 2023-03-17
      • 2012-11-27
      • 2010-12-08
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多