在什么情况下,单例设计模式可能会生成相同单例类的多个实例?

时间:2012-02-09 17:37:07

标签: c++ singleton

这是一个面试问题。

  

在C ++中,对于单例设计模式,是否有可能存在   该类的多个实例?如果是,在什么情况下?

我的想法:

在多线程情况下,如果没有同步保护,我们可能会有多个线程生成多个实例。

我们可以使用互斥锁进行保护。例如,使用互斥锁将全局变量保护为计数器,以保留实例数以确保只有一个实例。

有更好的想法吗?

7 个答案:

答案 0 :(得分:3)

在C ++ 11中,有一种新工具可以使一次性初始化可靠 - std::call_once。你可以找到一个很好的参考here。如果您正在使用支持C ++ 11的编译器,那么这将为您提供一种与平台无关的标准方法来实现它。

在平台依赖级别,大多数操作系统提供了进行一次性初始化的方法。例如。在iOS或OS X中,您可以使用Grand Central Dispatch中的dispatch_once。在Windows上,Vista和更高版本中有One-Time Initialization API可用。

当你没有标准替代品时,这些都很好,但是由于C ++ 11,你不再需要以平台相关的方式做这种事情。它非常适合单例初始化。

答案 1 :(得分:2)

看起来很明显,但如果你有多个进程,你可以拥有多个单例实例。我更像是一个java家伙,但如果你有任何与ClassLoader相同的东西,那么你可以再次拥有多个单身。 基本上你可以拥有与控制实例化的实体一样多的单例(在这里讨论工厂模式)

答案 2 :(得分:1)

在OS X上,不同动态库中的静态对象将是不同的实例。在Windows和Linux上,它们将按预期运行。

在不同平台的进程中拥有唯一静态对象的唯一保证方法是在导出函数中使用静态局部变量惯用法,即不是这样做:


foo.h中

static Foo* global_instance;

Foo.cpp中

static Foo* global_instance = new Foo();

你需要这样做:


foo.h中

Foo* get_global_instance();

Foo.cpp中

Foo* get_global_instance() {
     static Foo instance;
     return &instance;
    }

答案 3 :(得分:0)

明显的答案:这取决于实施,但如果是 存在多个实例的可能性,实现是 破碎。所以问题是因为:你可以犯什么样的错误 实施单身人士时要做什么? (答案是:漂亮 在实现任何模式时,您可以犯很多相同的错误。)

答案 4 :(得分:0)

检查双重检查锁定单例模式的问题。互联网上描述的问题很多次。但是......我一生中见过的99%的单身人士都使用这种模式:)

答案 5 :(得分:0)

好的,这是可能的。在接口上你有单例...但是在实现中选择了出于任何原因有多个实例..也许汇集?

答案 6 :(得分:0)

面试问题通常会尝试测试你对某个主题的知识,并且通常会对他们有一些技巧。我认为在这种情况下答案是这样的:如果该类中有一个实例,那么它不是单例模式。