这不是线程安全的:调用getInstance
的两个线程将导致数据竞争。一种常见的方法是使用一个函数作用域的静态变量:
static shared_ptr<Demo> getInstance(){
static shared_ptr<Demo> d(new Demo);
return d;
}
这种可变是保证准确地一旦被初始化,当控制越过其首次定义,并且在线程安全的方式。
在这一点上,虽然它不完全清楚你为什么想要使用shared_ptr
。你也可以做
static Demo& getInstance(){
static Demo d;
return d;
}
这是一个单身人士(好,其中之一)的教科书实施。
回复:用私有构造函数初始化。我不确定我了解你的困惑的本质。你问为什么Demo::getInstance
可以使用Demo
的私人构造函数?那么,因为它是Demo
的成员,并且类的成员可以访问该类的私有成员。你问为什么Demo::getInstance
可以调用shared_ptr<Demo>::reset()
传递Demo*
指针?那么,因为reset()
是shared_ptr
的公共成员函数,将一个指针作为参数。这个过程的哪一部分你有争议?
单身更是一种反模式,所以我建议不要实施它们。它们与全局变量没有什么不同。 – Jens
虽然很多人都认为单身使用不明智可能会造成问题,但我认为在这里批评它们并不是特别有用 - 它不会帮助提问者解决问题。 –