我正在用C开发一个项目,我需要释放已分配的内存,并在退出之前关闭所有打开的文件。
我决定实现一个clean
函数来执行所有这些操作,并使用atexit
调用它,因为有很多可能的退出方案。
问题是atexit
不允许我使用参数设置函数,因此我无法向clean
发送需要在结尾处释放的指针。这个过程。
所以我需要将每个可能需要释放的指针声明为全局变量,并且每个可能在程序中保持打开的文件? (我已经这样做但看起来不太好)或者是否存在与允许发送参数的atexit
类似的功能?或者更多可能还有另一种我失踪的方式?
答案 0 :(得分:4)
在函数内使用静态指针:
#include <stdio.h>
#include <stdlib.h>
void atexit_clean(void *data);
static void clean(void)
{
atexit_clean(NULL);
}
void atexit_clean(void *data)
{
static void *x;
if (data) {
x = data;
atexit(clean);
} else {
free(x);
}
}
int main(void)
{
int *a = malloc(sizeof(int));
atexit_clean(a);
return 0;
}
使用单个全局变量的另一种方法:您可以将所有要释放的对象存储在指针数组或链表中,此示例使用realloc
(不检查(m / re)alloc为简洁起见:
#include <stdio.h>
#include <stdlib.h>
static void **vclean;
static size_t nclean;
void atexit_add(void *data)
{
vclean = realloc(vclean, sizeof(void *) * (nclean + 1));
vclean[nclean++] = data;
}
void clean(void)
{
size_t i;
for (i = 0; i < nclean; i++) {
free(vclean[i]);
}
free(vclean);
}
int main(void)
{
int *a, *b, *c;
double *d;
int e = 1;
atexit(clean);
a = &e;
b = malloc(sizeof(int));
atexit_add(b);
c = malloc(sizeof(int));
atexit_add(c);
d = malloc(sizeof(double));
atexit_add(d);
return 0;
}
答案 1 :(得分:3)
无法将任何参数传递给atexit()
,因此您无法使用全局变量。
当您的程序正常终止,通过exit()
或从main()
返回时,它将自动刷新并关闭所有打开的流和(在大多数操作系统下)免费分配的内存。但是,最好在程序终止之前明确清理资源,因为它通常会导致更结构化的程序。 有时编写程序最简洁的方法就是退出并将清理保留给实现。
但请注意,您应始终检查fclose()
的返回值。见&#34; What are the reasons to check for error on close()?&#34;关于你什么时候可能发生的事情的轶事。