C++ - 一种确保调用全局清理函数的异常安全方法

C++ - an exception-safe way to assure a global cleanup function gets called

本文关键字:函数 异常 方法 安全 全局 调用 确保 一种 C++      更新时间:2023-10-16

上下文:

假设一个外部库要求调用其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
将其

包装为在析构函数中清理的类对我来说似乎是最佳选择。(假设库尚未作为类实现。