c - 如何检查多个 mallocs 并在出错时释放它们?

标签 c malloc

我有一个程序,我在其中使用大量 malloc(和其他类似函数)为不同的数据类型分配内存。正如我们所知,此功能可能会失败。我如何编写简洁的代码来检查内存是否已成功分配,如果没有,则释放所有以前的 malloc(如果有)?

我想也许可以编写一个函数来释放我 malloc 的每个指针,如果它们是 != NULL。但是之后我需要发送很多参数。 有更好的想法吗?

谢谢。

最佳答案

这实际上是一个不平凡的 C 编码习语问题。一种答案是学习 C++ 并使用 auto_pointer

在 C 语言中,我已经成功使用了以下习语。

  1. 在声明时将所有指针设置为 NULL
  2. 仅在需要时分配内存。
  3. 如果分配失败,设置错误值并转到末尾的标签,所有指针都被释放。
  4. 如果出于某种原因需要提前释放指针,请再次将其设置为 NULL。
  5. 所有正常执行都必须一直执行到最后,以便释放所有内容(没有中间 return)。

最终看起来像这样:

int err = 0;
FOO *p = NULL; 
BAR *q = NULL; 
BAZ *r = NULL;

p = malloc(...);
if (!p) {
  err = P_MALLOC_FAILURE;
  goto done;
}
....
q = malloc(...);
if (!q) {
  err = Q_MALLOC_FAILURE;
  goto done;
}
....
// Done with p.  Free it early.
free(p);
p = NULL;
....
done:
  free(p);
  free(q);
  return err;

free 的定义确保如果指针最后仍然为 NULL,则不会发生任何事情。如果你不喜欢重复的代码,你可以滥用一个宏:

#define ALLOC_OR_FAIL(P) do { \
  P = malloc(sizeof *P); \
  if (!P) { \
    err = P ## _MALLOC_FAILURE; \
    goto done; \
  } } while (0)

关于c - 如何检查多个 mallocs 并在出错时释放它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25753504/

相关文章:

python - 如何在 python 中使用 ctypes 创建包含 mpfr.h 类型的相应结构?

c - C 中的魔法与 malloc、fork 和 open

对 malloc 和 free 行为感到困惑

c++ - GtkGrid 没有显示附加到它的新小部件

c - 尝试使用 C 中的宏为文本着色,但得到 : error: expected ')'

c - opengl 的镜面光太多

c - 从 C 中的非 void 函数返回任何内容

c - 基本的 C 指针分配/释放

c++ - 新建、删除、malloc 和免费

c - 为什么当我使用函数分配内存时失败