前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多个so中模板单例的多次实例化

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

作者头像
meteoric
发布2018-11-19 17:12:55
3K0
发布2018-11-19 17:12:55
举报
文章被收录于专栏:游戏杂谈游戏杂谈游戏杂谈

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-08-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档