有一个静态库xx.lib,包含有class A的一个Singleton对象。
然后有多个dll引用到了A的这个Singleton对象,这时候发现,A的这个Singleton在每一个DLL里面都有独立的一份。
这种问题应该怎么解决呢?A的实现是这样的:
class A
{
public:
static A& Instance()
{
static A g_Instance;
return g_Instance;
}
~A(void){}
private:
A(void){}
};

解决方案 »

  1.   

    那就不能放在lib中了,放到dll,或exe中
      

  2.   

    dll是怎么引用的A的这个Singleton对象?
      

  3.   


    就是普通的A::Instance().XXX();
      

  4.   

    楼主的这个问题我也碰到过,静态库被多个EXE/DLL引用时,不可能有真正意义的单实例对象,每个模块都有一个独立的对象,碰巧这些模块都要加载到同一个进程空间中,结果单实例对象会出现多个,这是很正常的。
    以下的解决方法选择一种:
    1、不用静态库,改成动态库
    2、保证静态库只被一个模块引用
    3、通过某种方法全局登记一个指针,保存第一个对象实例的地址,后续对象实例创建之前先判断一下这个全局指针是否有效,如果有效就不用再创建了。可以使用TLS函数保存此指针,或者用COM函数登记此指针,或者把指针保存到注册表或者文件中……无论什么方法,保证一个进程内只有唯一一个所有模块都能访问到的指针变量。
      

  5.   

    除了一个 class A Singleton 外其他都是  <---------------定义
    extern class A Singleton               <---------------声明
      

  6.   


    这样会破坏Singleton的封装的样子,而且这样也无法确定对象的构造顺序呢。