有没有办法自动释放所有内存而不是做大量的free()函数?

时间:2012-05-19 23:51:22

标签: c

我只是想知道是否有办法在一个程序中一次释放所有内存而不是执行大量的free()函数,如下所示;

free(somevariable);

这不是一个真正的问题,但是如果一个程序包含很多变量,如果有一种全能释放来释放所有内存,或者某种方式一次为free()提供多个变量,如下所示,我会发现非常有帮助,谢谢!

free(var1,var2,var3)

5 个答案:

答案 0 :(得分:5)

每次拨打free()时,您都需要拨打malloc()

这不是必然意味着源代码中的每个malloc()调用都需要进行相应的free()调用;这是运行时必须匹配的调用,而不是源代码中的调用。但通常来源调用会匹配。

我还应该注意,free()所有malloc()内存不是绝对必需的。当程序终止时,所有分配的内存将返回给操作系统。 (C标准不保证这一点,但你可能会使用的任何操作系统都会这样做。)但是,自己清理后是一个好习惯;例如,程序可以成为更大程序的一部分。

答案 1 :(得分:1)

下面:

#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);

也就是说,给它一个指针计数,然后是指针列表, 它将免费拨打所有电话。

注意:这是一个糟糕的想法,也是一个糟糕的实施方式 不应该使用它。

答案 2 :(得分:1)

如果您的编译器支持__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

答案 3 :(得分:1)

你应该停下来思考一下你要求的东西。这没有意义。如果你唯一的目标是在退出之前打电话给“freeall”,它就没用了;终止程序将导致其整个内存空间(包括malloc所做的所有分配)不再存在。另一方面,如果您希望在程序终止之前在某个其他位置“释放”,那么您只是通过释放其背后的内存而违反了可能链接到您的程序中的所有第三方代码(如何知道您的代码?会释放它的记忆吗?)

话虽如此,有一些类似于你想要的东西,它起作用:talloc:

http://talloc.samba.org/talloc/doc/html/index.html

talloc的想法是你可以创建相关内存分配的上下文,并通过一次调用talloc_free将它们全部释放。它不仅非常方便,而且还简化了分配/解除分配逻辑,并且应该减少由于不正确的释放(双重释放,泄漏等)导致的错误的发生率。

答案 4 :(得分:0)

您需要smart pointer来处理数据结构的内存管理。

编辑: - 感谢Oli,刚刚意识到它是一个纯粹的C问题。智能指针是一个C ++结构。

在C中,你必须为你做的每一个显式分配都有一个免费的。