📜  C C++中的atexit()函数(1)

📅  最后修改于: 2023-12-03 15:29:41.417000             🧑  作者: Mango

介绍

在 C 和 C++ 中,atexit() 函数可以让程序员设置在程序正常终止(通过 exit() 函数)时执行的函数。

当程序退出时,atexit() 函数注册的函数会按照注册的逆序依次执行。这个特性非常有用,因为可以在程序退出时清理资源,释放内存等等。

使用方法

atexit() 函数的原型定义如下:

#include <stdlib.h>

int atexit(void (*func)(void));

其中,func 参数是一个指向无参数无返回值函数的指针,用于表示在程序退出时需要执行的函数。

下面是一个示例代码,在程序退出时输出一条信息:

#include <stdio.h>
#include <stdlib.h>

void cleanup() {
    printf("Cleaning up...\n");
}

int main() {
    atexit(cleanup);
    printf("Hello, world!\n");
    exit(0);
}

运行该程序,输出如下:

Hello, world!
Cleaning up...

这说明在程序退出前,cleanup() 函数被正确执行了。

如果需要在程序退出时执行多个函数,可以在代码中多次调用 atexit() 函数,如下所示:

#include <stdio.h>
#include <stdlib.h>

void cleanup1() {
    printf("Cleaning up 1...\n");
}

void cleanup2() {
    printf("Cleaning up 2...\n");
}

int main() {
    atexit(cleanup1);
    atexit(cleanup2);
    printf("Hello, world!\n");
    exit(0);
}

运行该程序,输出如下:

Hello, world!
Cleaning up 2...
Cleaning up 1...

可以看到,cleanup2()cleanup1() 函数按照逆序(即注册顺序的反向)依次执行。

注意事项

需要注意的是,如果程序是通过 abort() 函数或者信号等非正常终止的方式退出,atexit() 函数注册的函数不会被执行。

此外,如果程序中存在全局对象,则其销毁顺序不受 atexit() 函数的影响,因为全局对象的销毁顺序是根据链接器规定的。如果需要精确控制对象的销毁顺序,可以考虑使用类似于单例模式的方式来管理对象。

总结

atexit() 函数是一个非常有用的 C/C++ 函数,可以让程序员在程序正常退出时清理资源、释放内存等。使用 atexit() 函数需要注意其执行顺序以及其不会被非正常终止的程序执行的问题。