美文网首页C++精进之路
谈谈C++的ScopeExit

谈谈C++的ScopeExit

作者: this_is_for_u | 来源:发表于2020-01-27 11:58 被阅读0次

最近研究了boost中的ScopeExit,发现是个这是个很高级的特性,可以在作用域结束时自动关闭已经打开的资源或做某些清理操作。
举例: 如果没有ScopeExit

void test () {
    char *test = new char[100];
    if (a) {
        delete[] test; // count 1
        return;
    }
    xxx;
    if (b) {
        delete[] test; // count 2
        return;
    }
    xxx;
    delete[] test; // count 3
}

使用了ScopeExit

void test () {
    char *test = new char[100];
    ScopeExit {
        delete[] test; // 在test函数声明周期结束后自动执行delete[]操作
    };
    if (a) {
        return;
    }
    xxx;
    if (b) {
        return;
    }
    xxx;
}

当然,正常C++代码不鼓励使用裸指针,可以使用智能指针来申请资源,这里只是举个例子,使用ScopeExit也可以用于处理文件资源的关闭等等。
两者代码比较后优劣程度显而易见,不使用ScopeExit需要在return前多次做资源清理操作,而使用了ScopeExit则只需做一次声明后在作用域结束后会自动进行相关的资源清理操作,方便而且不易出错。

ScopeExit实现

这里参考boost使用C++11实现了一套ScopeExit机制

class ScopeExit {
   public:
    ScopeExit() = default;

    ScopeExit(const ScopeExit&) = delete;
    void operator=(const ScopeExit&) = delete;

    ScopeExit(ScopeExit&&) = default;
    ScopeExit& operator=(ScopeExit&&) = default;

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

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

   private:
    std::function<void()> func_;
};

#define _CONCAT(a, b) a##b
#define _MAKE_SCOPE_(line) ScopeExit _CONCAT(defer, line) = [&]()

#undef SCOPE_GUARD
#define SCOPE_GUARD _MAKE_SCOPE_(__LINE__)

使用方式如下:

void test () {
    char *test = new char[100];
    SCOPE_GUARD{
        delete[] test;
    };
    if (a) {
        return;
    }
    xxx;
    if (b) {
        return;
    }
    xxx;
}

相关文章

  • 谈谈C++的ScopeExit

    最近研究了boost中的ScopeExit,发现是个这是个很高级的特性,可以在作用域结束时自动关闭已经打开的资源或...

  • volatile 关键字(待续)

    参考资料 谈谈 C/C++ 中的 volatileC和C++中的volatile、内存屏障和CPU缓存一致性协议M...

  • c/c++学习笔记1-工具和资源

    谈谈c++学习 c++ 这种面向对象语言 在代码字面意思隐藏背后 做了很多工作 比如构造,隐式转换,这里边的很多东...

  • 你不会学习Java,请看这里,我将1分钟讲解如何速成Java技术

    来谈谈什么是Java吧? Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解...

  • 右值引用

    参考资料 谈谈 C++ 中的右值引用C++11 左值、右值、右值引用详解

  • C++(奥赛)【1】

    废话和准备 来自一位不争气的蒟蒻 谈谈C++ 不得不说C++很优秀功能和全面,这也是我所接触到底第一种语言, 听说...

  • 谈谈C++中闭包的实现

    python的闭包 闭包这个概念一直有所耳闻,在以前看《Java编程思想》时第一次真正接触,当时的理解就是类似C+...

  • java常用知识点

    谈谈你以Java的理解 平台无关性:一次编译,到处运行,归功于JVMGC:垃圾回收机制,不需要像C++开发人员那样...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • 浅谈C++中指针和引用的区别

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。1....

网友评论

    本文标题:谈谈C++的ScopeExit

    本文链接:https://www.haomeiwen.com/subject/iaasthtx.html