多个so中模板单例的多次实例化
在Android打包項目時,發(fā)現(xiàn)登錄功能不能使用了,logcat中也沒發(fā)現(xiàn)什么問題,最后一行一行l(wèi)og定位到了問題。原來是一個so文件中的構(gòu)造函數(shù)被初始化二次!
?
這個單例是通過繼承模板來實現(xiàn)的(暫時不考慮線程安全的問題)
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;
游戲主線程中是直接調(diào)用Instance()方法,之后又通過.so中的一個靜態(tài)方法來調(diào)用Instance(),實際上的結(jié)果是直接調(diào)用跟通過靜態(tài)方法調(diào)用,會初始化二次單例對象
?
目前暫時的處理方法是,主線程中通過調(diào)用.so的靜態(tài)方法,在該靜態(tài)方法中調(diào)用Instance的方法,這樣就只會產(chǎn)生一個實例對象了。這里暫時沒涉及到多線程程的問題,所以也沒有加上線程安全的全碼
?
通過靜態(tài)方法,然后再調(diào)用實例對象,這確實是一個很糟糕的方法,為了游戲能跑,暫時這樣處理了。
?
參考:
動態(tài)庫之間單例模式出現(xiàn)多個實例(Linux)
C++中模板單例的跨SO(DLL)問題:RTTI,typeid,static,單例
轉(zhuǎn)載于:https://www.cnblogs.com/meteoric_cry/p/3942060.html
總結(jié)
以上是生活随笔為你收集整理的多个so中模板单例的多次实例化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的定时器用法
- 下一篇: 多线程开发之---线程等待