gpt4 book ai didi

c++ - 单例可以在其析构函数中使用另一个单例吗?

转载 作者:行者123 更新时间:2023-11-30 03:40:17 30 4
gpt4 key购买 nike

我有两个经理(都是单例):

  1. 许可管理器,在使用功能时计算许可 token 。此版本的析构函数释放所有许可证。
  2. Python 管理器,管理从 C++ 对 Python 的调用,它需要许可证管理器的特定许可证。析构函数调用许可证管理器以完成许可证使用。

我想单例的销毁顺序是未定义的。 如何避免管理器销毁时的不匹配?可能吗?

这是我典型的单例实现:

class Manager : private boost::noncopyable
{
private:
struct singleton_deleter { void operator () (Manager* m) { delete m; } };
friend struct Manager::singleton_deleter;

private:
boost::mutex singleton_mutex;
boost::shared_ptr<Manager> singleton_instance;

public:
static Manager& instance()
{
if(!(bool)Manager::singleton_instance)
{
boost::mutex::scoped_lock lock(Manager::singleton_mutex);
if(!(bool)Manager::singleton_instance)
Manager::singleton_mutex.reset(new Manager, Manager::singleton_deleter());
}
return *Manager::singleton_instance;
}

private:
Manager() { this->lic = LicManager::instance().getLicense(); }
~Manager() { LicManager::instance().releaseLicense(this->lic); }
};

最佳答案

请注意,由于 destruction order of static objects in C++the reverse根据它们的构造顺序,您可以让一个单例的构造函数首先构造它所依赖的另一个单例作为函数局部静态对象。例如:

LicManager & LicManager::instance() {
static LicManager licenceManager;
return licenceManager;
}

Manager & Manager::instance() {
static Manager manager(LicManager::instance());
return manager;
}

另一种方法是使用 shared_ptr共享单例的所有权,执行销毁命令。制作instance()返回 shared_ptr而不是引用。在您的用例中,存储 LicManager::instance() 的返回值(例如 shared_ptr<LicManager> )在您的 Manager 中目的。这迫使 LicManagerManager的一生中保持活力, 即使相应的 LicManager全局范围内的共享指针被销毁。

编辑:正如评论中所指出的,另一种解决方案是只有一个 super 单例,它拥有所有其他单例并控制初始化/销毁顺序。

关于c++ - 单例可以在其析构函数中使用另一个单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123443/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com