在Android打包项目时,发现登录功能不能使用了,logcat中也没发现什么问题,最后一行一行log定位到了问题。原来是一个so文件中的构造函数被初始化二次!
这个单例是通过继承模板来实现的(暂时不考虑线程安全的问题)
templateclass 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 T * CSingleT ::ms_pObject = NULL;
游戏主线程中是直接调用Instance()方法,之后又通过.so中的一个静态方法来调用Instance(),实际上的结果是直接调用跟通过静态方法调用,会初始化二次单例对象
目前暂时的处理方法是,主线程中通过调用.so的静态方法,在该静态方法中调用Instance的方法,这样就只会产生一个实例对象了。这里暂时没涉及到多线程程的问题,所以也没有加上线程安全的全码
通过静态方法,然后再调用实例对象,这确实是一个很,为了游戏能跑,暂时这样处理了。
参考: