共享库中单例的多个实例
class singleton
{
public:
static singleton* instance()
{
static singleton p;
return &p;
}
private:
singleton(){}
}
template<class T>
class CSingleT
{
public:
static T * Instance()
{
if (!ms_pObject)
{
ms_pObject = new T;
}
return ms_pObject;
}
protected:
static T * ms_pObject;
}
template <class T>
T * CSingleT<T>::ms_pObject = NULL;
模板是编译的时候实例化成“真正的类”,即编译生成动态库的过程中,编译器进行了的实例化过程
在动态链接过程中,在其他库没有发现有singleton::instance这个实例(但是事实上,该实例已经存在了),那么就会自己创建一个实例,这样就导致了多个实例。
使用运行时加载的共享库时必须小心。这样的构造严格不是C ++标准的一部分,您必须仔细考虑这样一个过程的语义是什么。
解决方法
#ifdef SINGLETON_EXPORTS
#define SINGLETON_API __declspec(dllexport)
#else
#define SINGLETON_API __declspec(dllimport)
#endif
Linux
-rdynamic 暴露了函数名,共享动态符号表