多个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,单例

目录
相关文章
|
设计模式 Java
创建对象的方式有哪些
创建对象的方式有哪些
|
2月前
|
设计模式 前端开发 安全
Qt注册类对象单例与单类型区别
在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
33 2
|
5月前
|
JavaScript 前端开发
浅谈一下实例化
浅谈一下实例化
|
6月前
|
定位技术 API C++
单例,函数的三种调用方式
单例,函数的三种调用方式
37 0
|
存储
什么是实例化?
什么是实例化?
80 0
|
设计模式 Python
我为什么要创建一个不能被实例化的类
我为什么要创建一个不能被实例化的类
72 0
|
XML 缓存 Java
SpringBean(配置、实例化、作用域、生命周期、装配方式)
SpringBean(配置、实例化、作用域、生命周期、装配方式)
165 0
SpringBean(配置、实例化、作用域、生命周期、装配方式)
|
Java 开发者
Class 类对象的三种实例化模式|学习笔记
快速学习 Class 类对象的三种实例化模式
172 0
Class 类对象的三种实例化模式|学习笔记
|
C++ 小程序
c++类的实例化,有没有new的区别
A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
1237 0
|
XML 缓存 Java
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Spring是如何解决循环依赖?