我只是想知道是否有一种方法可以在程序中一次释放所有内存,而不是执行大量的 free() 函数,如下所示;
free(somevariable);
这不是一个真正的问题,但如果程序包含许多变量,如果有一种包罗万象的方法可以在最后释放所有内存,或者提供超过一次一个变量释放(),如下所示,我会发现这非常有帮助,谢谢!
free(var1,var2,var3)
我只是想知道是否有一种方法可以在程序中一次释放所有内存,而不是执行大量的 free() 函数,如下所示;
free(somevariable);
这不是一个真正的问题,但如果程序包含许多变量,如果有一种包罗万象的方法可以在最后释放所有内存,或者提供超过一次一个变量释放(),如下所示,我会发现这非常有帮助,谢谢!
free(var1,var2,var3)
free()
每次调用 都需要调用malloc()
。
这并不一定意味着malloc()
源代码中的每个调用都需要有相应的free()
调用;必须匹配的是运行时的调用,而不是源代码中的调用。但通常源调用会匹配。
我还应该注意,并不是绝对需要free()
ing all ed 内存。malloc()
当您的程序终止时,所有分配的内存都将返回给操作系统。(C 标准不保证这一点,但您可能使用的任何操作系统都可以做到这一点。)但是自己清理是一个好习惯。例如,一个程序可以成为一个更大的程序的一部分。
这里:
#include <stdlib.h>
#include <stdarg.h>
void vfree(int count, ...) {
va_list ap;
int i;
va_start(ap, count);
for (i=0; i<count; i++) {
void *ptr;
ptr = va_arg(ap, void *);
printf("arg %d = %p\n", i, ptr);
free(ptr);
}
va_end(ap);
}
像这样称呼它:
vfree(3, ptr1, ptr2, ptr3);
也就是说,给它一个指针计数,然后是指针列表,它会在所有指针上调用 free。
注意:这是一个糟糕的想法和糟糕的实现,你不应该使用它。
如果您的编译器支持__VA_ARGS__
(gcc 支持并且最新的 Visual C++ 应该支持),那么您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#define FREE(...) \
{ \
void* pointers[] = { __VA_ARGS__ }; \
size_t i; \
for (i = 0; i < sizeof(pointers) / sizeof(pointers[0]); i++) \
printf("freeing %p\n", pointers[i]); \
free(pointers[i]); \
}
int main(void)
{
void *p1 = malloc(1), *p2 = malloc(2), *p3 = malloc(3);
printf("p1=%p, p2=%p, p3=%p\n", p1, p2, p3);
FREE(p1, p2, p3);
return 0;
}
输出:
p1=005E17C0, p2=005E17E0, p3=005E17F0
freeing 005E17C0
freeing 005E17E0
freeing 005E17F0
你应该停下来想一想你要的是什么。这没有意义。如果您的唯一目标是在退出前调用“freeall”,那是没有用的;终止程序将导致其整个内存空间(包括 malloc 进行的所有分配)不复存在。另一方面,如果您想在程序终止之前的某个其他时间“释放所有”,那么您刚刚违反了所有可能链接到您的程序的第三方代码,方法是在其背后释放内存(它怎么会知道您的代码会释放它的内存吗?)
话虽如此,有一些类似于你想要的东西,它确实有效:talloc:
http://talloc.samba.org/talloc/doc/html/index.html
talloc 的想法是您可以创建相关内存分配的上下文,并通过一次调用talloc_free 将它们全部释放。它不仅非常方便,而且还简化了分配/释放逻辑,并且应该减少由于不正确释放(双重释放、泄漏等)而导致的错误发生率。
您需要一个智能指针来处理数据结构的内存管理。
编辑:-感谢 Oli ,刚刚意识到它是一个纯 C 问题。智能指针是一种 C++ 结构。
在 C 语言中,你必须为你所做的每一个显式分配基本上都有一个空闲。