首页 > 代码库 > 多个so中模板单例的多次实例化
多个so中模板单例的多次实例化
在Android打包项目时,发现登录功能不能使用了,logcat中也没发现什么问题,最后一行一行log定位到了问题。原来是一个so文件中的构造函数被初始化二次!
这个单例是通过继承模板来实现的(暂时不考虑线程安全的问题)
template<class T>
class CSingleT
{
public:
static T * Instance()
{
if (!ms_pObject)
{
ms_pObject = new T;
}
return ms_pObject;
}
static void Create()
{
if (!ms_pObject)
{
ms_pObject = new T;
}
}
static void Destroy()
{
if (ms_pObject)
{
delete ms_pObject;
ms_pObject = NULL;
}
}
static T * Get()
{
return ms_pObject;
}
static void Reset()
{
Destroy();
Create();
}
protected:
static T * ms_pObject;
};
template <class T>
T * CSingleT<T>::ms_pObject = NULL;
游戏主线程中是直接调用Instance()方法,之后又通过.so中的一个静态方法来调用Instance(),实际上的结果是直接调用跟通过静态方法调用,会初始化二次单例对象
目前暂时的处理方法是,主线程中通过调用.so的静态方法,在该静态方法中调用Instance的方法,这样就只会产生一个实例对象了。这里暂时没涉及到多线程程的问题,所以也没有加上线程安全的全码
通过静态方法,然后再调用实例对象,这确实是一个很糟糕的方法,为了游戏能跑,暂时这样处理了。
参考:
动态库之间单例模式出现多个实例(Linux)
C++中模板单例的跨SO(DLL)问题:RTTI,typeid,static,单例
多个so中模板单例的多次实例化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。