有一个静态库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){}
};
然后有多个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){}
};
就是普通的A::Instance().XXX();
以下的解决方法选择一种:
1、不用静态库,改成动态库
2、保证静态库只被一个模块引用
3、通过某种方法全局登记一个指针,保存第一个对象实例的地址,后续对象实例创建之前先判断一下这个全局指针是否有效,如果有效就不用再创建了。可以使用TLS函数保存此指针,或者用COM函数登记此指针,或者把指针保存到注册表或者文件中……无论什么方法,保证一个进程内只有唯一一个所有模块都能访问到的指针变量。
extern class A Singleton <---------------声明
这样会破坏Singleton的封装的样子,而且这样也无法确定对象的构造顺序呢。