C++ - 一种确保调用全局清理函数的异常安全方法
C++ - an exception-safe way to assure a global cleanup function gets called
上下文:
假设一个外部库要求调用其globalCleanup()
函数以确保清理其所有资源(它可能会在任何调用期间分配一些全局资源)。客户端函数client()
在其许多return
中的每一个之前执行此操作,但这当然不是异常安全的,并且代码是重复的。
问题:
有没有一种优雅的方法来确保在client()
出口时调用此全局函数?定义一个虚拟类,其唯一目的是在析构函数(RAII 样式)中调用全局函数是一种选择,但也许还有更简单的东西?
TLDR:如何调用RAII风格的全局清理函数?
class Cleaner {
public:
Cleaner() {}
~Cleaner() { ExtLib::CleanGlobal(); }
};
void client() {
Cleaner cleaner;
// Code that works with ExtLib
}
#include "loki/ScopeGuard.h"
client()
{
LOKI_ON_BLOCK_EXIT(globalCleanup);
// some codes here
} // globalCleanup will be called when exit this block
将其
包装为在析构函数中清理的类对我来说似乎是最佳选择。(假设库尚未作为类实现。
相关文章:
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 通过引用从 c++ 函数异常返回对象是否安全
- 智能指针和构造函数异常
- 构造函数C++异常说明符
- boost::archive::text_iarchive构造函数异常
- C++堆栈对象的构造函数异常处理
- 默认构造函数C++异常不会引发吗?
- 重写std的析构函数:异常
- 将向量作为参数(C++)传递时,没有匹配函数异常
- 当函数中静态变量的构造函数异常终止时会发生什么
- 如何:捕获输入函数异常的可变包装函数
- 在c++中,如果基类构造函数异常,则构造函数和析构函数的顺序可以是这样
- noexcept(false)析构函数覆盖所有特殊成员函数'异常规范
- c++重载函数异常规范
- c++ RAII析构函数异常
- 如何捕获构造函数异常
- C++构造函数异常处理
- 捕获构造函数异常的RAII方法
- C++析构函数异常
- Std::unique_ptr::reset和构造函数异常