C++11 仿照swift 中的defer 实现的defer功能

本文介绍了如何在C++11中模仿swift的defer关键字,以确保在代码块结束时执行特定的清理操作,防止资源泄露。通过创建一个类并在析构时执行保存的代码块,作者展示了其实现过程并进行了测试,证明功能成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

使用过swift开发过iOS应用的广大搬砖工都知道, 在swift语言里, 有一个很好用的关键字 defer
这个defer有什么用呢?
在某个函数或者代码块中, 如果使用了defer 添加了一段代码, 会发生什么呢?
哈哈, 当然是 在代码块结束时, 一定会调用这段代码了。
这样有什么好处呢?
我们知道, 有些操作需要很多步骤,其中一步出错,就可能需要是整个操作流程结束, 但是结束之前那些已经申请的资源怎么办呢? 如果不处理肯定会出现资源泄露的啊。这是defer就派上用场了,使用defer 之后, 在后面的代码块中去释放申请占用的资源, 就会保证在代码块结束之前一定会调用这个defer代码块来释放资源, 保证了一定的安全性

瞎想

那作为一名C++开发者来说,有没有这个便利的工具呢?
老实说, 从原生C++角度来说, 是没有这个工具的,有点可惜! 那我们能不能自己实现呢?

分析

1.  defer 功能是退出代码块时必定会执行代码, C++里面有这种机制吗? 当然有啊, 局部对象的析构函数, 可行性 +1
2.  defer 后面接的是代码块, C++11以后, 也有了lambda表达式的支持, 可行性再次 +1
3.  defer 后面所接的代码块是不带括号尾部闭包格式, C++ 有什么方式可以以函数对象为参数且不需要括号就能调用的呢? 哈哈, 有, + - * /  << >> +=  -= 等等操作符调用时不需要加括号, 可行性再次 +1

如何实现

需要定义一个类, 这个类可以通过调用操作符的方式往内部追加一个代码块, 并且在该类的对象析构时, 一定会去调用内部保存的代码块

动手试试

不如我们就定义一个类叫Defer好了, 至于用哪个操作符呢? 凭自己喜好啊, 我这里使用了 += 表示往里头追加, 哈哈

#include <vector>
#include <functional>
struct Defer {
   
   
    Defer& operator+=(std::function<void()> block) {
   
   
        m_defers.emplace_back(std::move(block));
        return *this;
    }

    ~Defer() {
   
   
        
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值