多个so中模板单例的多次实例化

简介: 在Android打包项目时,发现登录功能不能使用了,logcat中也没发现什么问题,最后一行一行log定位到了问题。原来是一个so文件中的构造函数被初始化二次!   这个单例是通过继承模板来实现的(暂时不考虑线程安全的问题) templateclass CSingleT{public:s...

在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,单例

目录
相关文章
|
6月前
|
设计模式 Java
创建对象的方式有哪些
创建对象的方式有哪些
|
10月前
|
存储
什么是实例化?
什么是实例化?
48 0
|
11月前
|
设计模式 Python
我为什么要创建一个不能被实例化的类
我为什么要创建一个不能被实例化的类
40 0
IOC创建对象方式
1.使用无参构造创建对象,默认!
|
XML 缓存 Java
SpringBean(配置、实例化、作用域、生命周期、装配方式)
SpringBean(配置、实例化、作用域、生命周期、装配方式)
129 0
SpringBean(配置、实例化、作用域、生命周期、装配方式)
|
XML 缓存 Java
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Spring是如何解决循环依赖?
|
JavaScript 前端开发
创建对象的几种方式(二)
创建对象的几种方式(二)
91 0
|
JavaScript 前端开发
创建对象的几种方式(一)
创建对象的几种方式(一)
104 0
|
Java 对象存储
《创建对象的5种方式》v
《创建对象的5种方式》
87 0
|
设计模式 存储 安全
C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?
C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?
446 1
C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?