0

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

free(somevariable);

这不是一个真正的问题,但如果程序包含许多变量,如果有一种包罗万象的方法可以在最后释放所有内存,或者提供超过一次一个变量释放(),如下所示,我会发现这非常有帮助,谢谢!

free(var1,var2,var3)
4

5 回答 5

5

free()每次调用 都需要调用malloc()

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

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

于 2012-05-20T00:23:46.660 回答
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);

也就是说,给它一个指针计数,然后是指针列表,它会在所有指针上调用 free。

注意:这是一个糟糕的想法和糟糕的实现,你不应该使用它。

于 2012-05-20T00:01:36.477 回答
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
于 2012-05-20T01:23:03.210 回答
1

你应该停下来想一想你要的是什么。这没有意义。如果您的唯一目标是在退出前调用“freeall”,那是没有用的;终止程序将导致其整个内存空间(包括 malloc 进行的所有分配)不复存在。另一方面,如果您想在程序终止之前的某个其他时间“释放所有”,那么您刚刚违反了所有可能链接到您的程序的第三方代码,方法是在其背后释放内存(它怎么会知道您的代码会释放它的内存吗?)

话虽如此,有一些类似于你想要的东西,它确实有效:talloc:

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

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

于 2012-05-20T04:07:34.067 回答
0

您需要一个智能指针来处理数据结构的内存管理。

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

在 C 语言中,你必须为你所做的每一个显式分配基本上都有一个空闲。

于 2012-05-20T00:52:54.863 回答