作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的单例结构:
// 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()
方法。最佳答案
对于退出 main()
后无法访问单例的单线程应用程序,您可以使用一种相当简单的方法自动执行所有操作:
Root& Root::get() {
static std::unique_ptr<Root> rc(new Root());
return *rc;
}
此上下文中的 static
表示变量在第一次调用函数时初始化,然后保持不变。 C++ 运行时安排 static
变量 rc
在某个时刻被销毁。对于在进入 main()
之前启动线程的多线程应用程序,您需要一种不同的方法来确保静态变量仅由线程初始化。
也就是说,请注意我强烈建议不要使用反-模式单例(也称为全局数据)。以上代码示例不构成任何形式的推荐!您想要使用单例的有效用途很少,大多数用途都不是。我见过的所有有效用途都使用不可变的单例。可变单例对象往往会成为一个同步点,并且会像全局数据一样混淆使用数据。
关于c++ - 单例实例释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8980855/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!