存在一种在不使用全局变量的情况下释放atexit或类似内存的方法?
我正在用C开发一个项目,我需要释放已分配的内存,并在退出之前关闭所有打开的文件。
我决定实现一个clean
函数来完成所有这些工作并用atexit
调用它,因为有很多可能的退出场景。
问题是atexit
不允许我用参数设置函数,所以我不能发送clean
需要在进程结束时释放的指针。
所以我需要将每个可能需要释放的指针声明为全局变量,并且每个可能在程序中保持打开的文件? (我已经这样做但看起来不太好)或者确实存在类似的function,允许发送参数的atexit
? 或者更多可能还有另一种我失踪的方式?
在函数内使用静态指针:
#include #include 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 #include 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; }
没有办法将任何参数传递给atexit()
,所以你使用全局变量。
当程序正常终止时,通过exit()
或从main()
返回,它将自动刷新并关闭所有打开的流和(在大多数操作系统下)免费分配的内存。 但是,最好在程序终止之前明确清理资源,因为它通常会导致更结构化的程序。 有时 ,编写程序最简洁的方法就是退出并将清理留给实现。
但要注意,您应该始终检查fclose()
的返回值。 请参阅“ 关闭()时检查错误的原因是什么? ”这是一个关于不这样做时会发生什么的轶事。