c++常用工具之 SCOPE_GUARD

该代码实现了一个C++的作用域退出类`scope_exit`,用于在作用域结束时自动执行回调函数,类似于智能指针在析构时自动释放内存。`SCOPE_GUARD`宏用于创建`scope_exit`实例,确保在函数返回时执行清理操作,例如释放动态分配的内存。
摘要由CSDN通过智能技术生成
// defer.hpp
#pragma once

#include <functional>

namespace toolkit {
class scope_exit {
  public:
    scope_exit() = default;

    scope_exit(const scope_exit&)            = delete;
    scope_exit& operator=(const scope_exit&) = delete;

    scope_exit(scope_exit&&)            = default;
    scope_exit& operator=(scope_exit&&) = default;

    template <typename F, typename... Args>
    scope_exit(F&& f, Args&&... args)
    {
        func_ = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
    }

    ~scope_exit()
    {
        if (func_) {
            func_();
        }
    }

  private:
    using Callable = std::function<void()>;
    Callable func_;
};
}  // namespace toolkit

#define _CONCAT(__x, __y) __x##__y
#define _MAKE_SCOPE(__x)  toolkit::scope_exit _CONCAT(defer, __x) = [&]()
#define SCOPE_GUARD       _MAKE_SCOPE(__LINE__)

使用:

// main.cpp
#include <iostream>
#include <string>
#include "defer.hpp"


int main(int argc, char** argv)
{
    void* foo = (void*)malloc(10);
    SCOPE_GUARD
    {
        std::cout << "free" << std::endl;
        free(foo);
    };

    void* foo1 = (void*)malloc(10);
    SCOPE_GUARD
    {
        std::cout << "free" << std::endl;
        free(foo1);
    };
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

血_影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值