C/C++初始化和去初始化函数

init/deinit

初始化/去初始化函数根据作用域可以分为几种不同的应用情形

 1. 全局初始化/去初始化
    这一次运行程序只做这一次初始化/去初始化
 2. 模块初始化/去初始化
    每次加载/卸载这个模块都调用一次初始化/去初始化

全局初始化

以ffmpeg为例 需要首先调用av_register_all接口注册所支持的编解码器等等
一般只需要程序运行时注册一次 程序退出前注销一次
全局初始化的简单实现:
#include <functional>

using namespace std;

class onceFunction {
public:
    typedef function<void(void)> task;
    onceFunction(const task &init, const task &deinit = nullptr){
        if (init) {
            init();
        }
        _destroyer = deinit;
    }
    virtual ~onceFunction() {
        if (_destroyer) {
            _destroyer();
        }
    }
private:
    onceFunction &opeartor =(const onceToken &);
    onceFunction();
    task _destroyer;
};

static onceFunction gToken([](){
                        printf("onceFunction init\n");
                    },nullptr);

int main() {
    printf("main function\n");
    return 0;
}

执行结果:
onceFunction init
main function

全局初始化是利用静态全局变量生成的时机早于main函数执行实现
类构造时执行初始化 析构时执行去初始化

模块初始化

模块初始化的实现方法不止一种
比如C风格代码的flag写法
struct ctx{
    int flag;
};

void ctx_init(struct ctx* ctx) {
    if (flag) {
        //init
        flag = false;
    }
}

或者也可以把初始化和去初始化函数放在这个模块的类的构造/析构函数中执行
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值