按照ISO C的规定,一个进程可以注册多大32个函数,这些函数将由exit自动调用。这些函数被称为“终止处理程序”(exit handler),并调用atexit函数来注册这些函数。
#include <stdlib.h>
/*成功返回0,失败返回非0*/
int atexit(void (*func)(void));
从原型我们可以看到,被注册的函数是一个没有返回值很没有参数的函数,我们可以使用这个特性来实现面向对象的析构函数。
#include <stdlib.h>
#include <stdio.h>
void func(void);
int main() {
int res;
res = atexit(func);
if (res == 0) {
printf("Resgister destory success./n");
exit(0);
} else {
printf("Resgister destory failure./n");
exit(1);
}
}
void func(void) {
printf("Program is exiting.../n");
}
$ gcc atexit.c -o atexit
$ ./atexit
输出:
Resgister destory success.
Program is exiting...
所以可以看到析构函数已经执行了,利用这个方法,我们可以在程序退出的时候自动关闭一些资源句柄,如文件句柄等。