我有一个程序,我在其中使用大量 malloc(和其他类似函数)为不同的数据类型分配内存。正如我们所知,此功能可能会失败。我如何编写简洁的代码来检查内存是否已成功分配,如果没有,则释放所有以前的 malloc(如果有)?
我想也许可以编写一个函数来释放我 malloc 的每个指针,如果它们是 != NULL。但是之后我需要发送很多参数。 有更好的想法吗?
谢谢。
最佳答案
这实际上是一个不平凡的 C 编码习语问题。一种答案是学习 C++ 并使用 auto_pointer
。
在 C 语言中,我已经成功使用了以下习语。
- 在声明时将所有指针设置为
NULL
。 - 仅在需要时分配内存。
- 如果分配失败,设置错误值并
转到
末尾的标签,所有指针都被释放。 - 如果出于某种原因需要提前释放指针,请再次将其设置为 NULL。
- 所有正常执行都必须一直执行到最后,以便释放所有内容(没有中间
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/