我有这样的单结构:Singleton实例释放
// Hpp
class Root : public boost::noncopyable
{
public:
~Root();
static Root &Get();
void Initialize();
void Deinitialize();
private:
Root(); // Private for singleton purposes
static Root *mInstance;
Manager1 *mManager1;
Manager2 *mManager2;
};
// Cpp
Root *Root::mInstance = nullptr;
Root::Root()
{
mInstance = this;
// Managers are using `mInstance` in their constructors
mManager1 = new Manager1();
mManager2 = new Manager2();
mInstance->Initialize();
}
Root::~Root() { delete mManager1; delete mManager2; }
Root &Root::Get()
{
if (mInstance == nullptr) mInstance = new Root();
return *mInstance;
}
void Root::Deinitialize()
{
delete mInstance;
}
这里是这个单的用法:
Root::Get();
// Some code calling related to mManager1 and mManager2
Root::Get().Deinitialize();
的问题是:
- 这是存储安全地使用这种单身结构?
- 如何自动删除
mInstance
(手动拨打dtor)。因为用户可能忘记调用Deinitialize()
方法。
如果用户不调用'Deinitialize' - 你怎么知道它应该被调用?你会怎样手动调用dtor?你为什么使用单身人士开始? – littleadv
@littleadv boost的'serialization :: singleton'在程序退出时调用dtor,并在开始时调用ctor(初始化静态内存时)。 – Ockonal
这是一个单身人士,用户*有*做你的API来破坏单身人士,通常在'main'结束之前是个好地方。明确摧毁单身人士总是最好的,这会在以后帮助你解除痛苦。 –