在模块加载/卸载时构造/破坏外部c++模块中的对象

Constructing/destructing an object in external c++ module on module load/unload

本文关键字:模块 c++ 外部 对象 卸载 加载      更新时间:2023-10-16

我用c++编写了一个python模块。一切都很好,但现在我想添加日志记录。我的记录器类(第三方)需要初始化,类似于:

int main()
{
    Logger logger("log.log");
    Logger::Register(&logger);
    DoSomethingAndLog();
    return 0;
}

正如您所看到的,logger是在程序初始化时创建的,而在程序终止时销毁。

我在哪里创建Logger对象,以便在模块加载时构建它,并在模块卸载时销毁它?

您可以将Logger对象包装到一个类中,并声明该类的全局实例。与原始全局Logger变量相比,这种方法有一点优势,因为您可以控制构造函数和析构函数中的初始化和去初始化。您还可以限制对Logger对象的访问。

class TheLogger
{
public:
  TheLogger() { Logger::Register(&_logger); }
  ~TheLogger() { Logger::Unregister(&_logger); }
  Logger& GetLogger() { return _logger; }
private:
  Logger _logger;
};
TheLogger theLogger;
int main()
{
  DoSomethingAndLog();
  theLogger.GetLogger().Log("...");
  return 0;
}