c - 记录内存分配错误

标签 c memory-management malloc

假设我正在尝试在 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/

相关文章:

c - 如何读取用 popen 打开的进程的标准输出(with\r)

将整数转换为 0x 等价物(十六进制)

c - 我怎样才能更好地理解内核 C 编程代码

iphone - Objective-C 内存问题

即使没有传递指针,线程中的所有函数都可以访问动态分配的内存(堆)吗?或者它是函数的本地函数吗?

ios4 - alloc、copy 和 new 有什么区别?

c - 以基本方式使用线程的段错误

c++ - C中的&&&&操作是什么

c - 将多个字符串作为输入时出现不必要的换行符

c - 在 C 中分配无符号长整型内存时出错