我很快就会在我的博客上发布一篇文章,但我想先确认我没有错过任何内容。
找到一个我错过的例子,我会在我的帖子中引用你。
主题是失败的Singleton implementations:在什么情况下你会不小心得到一个singleton的多个实例?
到目前为止,我想出了:
- 第一次调用时的竞争条件
instance()
- 并入多个 DLL 或 DLL 和可执行文件
- 单例的模板定义 - 实际上是单独的类
我还缺少任何其他方式——也许是继承?
我很快就会在我的博客上发布一篇文章,但我想先确认我没有错过任何内容。
找到一个我错过的例子,我会在我的帖子中引用你。
主题是失败的Singleton implementations:在什么情况下你会不小心得到一个singleton的多个实例?
到目前为止,我想出了:
instance()
我还缺少任何其他方式——也许是继承?
如果您使用在 cpp 文件中初始化的静态实例字段,如果某些静态/全局的初始化尝试获取单例的实例,您可以获得多个实例(甚至更糟糕的行为)。这是因为跨编译单元的静态初始化顺序是未定义的。
只要 ctor 是私有的,继承就不应该成为问题。
但是,如果您不禁止复制构造函数,用户可能会[无意]复制单例实例。从boost::noncopyable私下继承是防止这种情况的最简单方法。