atexit


atexit

  atexit用来注册在程序正常终止时调用的函数。
  
  一个进程可以登记多达32个函数,这些函数将由exit自动调用。这些函数被称为“终止处理函数(exit handler)”,atexit函数负责登记这些函数。
  atexit的原型及所在头文件

#include <stdlib.h>
int atexit(void (*function)(void));

  atexit的参数function是一个函数指针,function不含任务参数,也不返回一个值。

注:对于atexit的参数,我们如何确定其类型?
首先,将变量名字拿掉,余下的部分就是其类型。即function的类型为void (*)(void)
然后,由内而外看,function先与*结合,说明function是一个指针;
而后与函数调用符”()”结合,说明其指向的是一个函数;
参数列表中的void的,显示的指定该函数不需要参数;
最后,最前面的void指明函数不需要返回一个值。
因此,function是一个函数指针,它所指向函数的参数列表为空,返回类型为void。

  atexit的特性:

  1. exit调用这些函数的顺序与它们登记时候的顺序相反。
  2. 同一函数如若登记多次,则也会被调用多次。

测试

  在测试文件中,main函数开始处先注册一个终止处理函数foo,再注册两个终止处理函数goo。

#include <stdio.h>

void foo()
{
    printf("foo......\n");
}

void goo()
{
    static int a = 0;
    printf("goo......%d\n", ++a);
}

int main(void)
{
    atexit(foo);
    atexit(goo);
    atexit(goo);
    printf("main......\n");

    return 0;
}

  编译后执行一下,看看效果:
这里写图片描述
  可以看到,main函数流程结束后,exit分别调用了goo、goo和foo函数,调用顺序与它们的注册顺序相反。


  [注:由atexit的调用顺序想到的C++对象析构顺序]
  C++含类继承关系的对象,其析构顺序与此类型。
这里写图片描述

  如有父类Parent和其子类Child。如有下面语句: 

Child c;

  则先调用Parent的构造函数,再调用Child的构造函数;而析构时,则先调用Child的析构函数,再调用Parent的析构函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值