单例好像不适合做成模板

火花20180731 2020-08-04 10:31:09
我的单例模板:

// Singleton
#ifndef SINGLETON_H
#define SINGLETON_H

#include <QMutex>

template<class T>
class Singleton
{
public:
static T* Instance()
{
if (!m_pInstance)
{
m_mutex.lock();
if (!m_pInstance)
{
m_pInstance = new T;
}
m_mutex.unlock();
}
return m_pInstance;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) {}
Singleton& operator=(const Singleton&) { return *this; }
private:
class Garbo
{
public:
Garbo() {}
~Garbo()
{
if (m_pInstance)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
};
private:
static Singleton* m_pInstance;
static QMutex m_mutex;
static Garbo m_garbo;
};

template<class T>
T* Singleton<T>::m_pInstance = NULL;
template<class T>
QMutex Singleton<T>::m_mutex;
template<class T>
typename Singleton<T>::Garbo Singleton<T>::m_garbo;

#endif /* SINGLETON_H */


使用的时候:

Singleton<MyClass>::Instance()->func();

但是从调试的结果来看,每次调用Instance后,会单独实例化一个MyClass实例,而不是同一个实例(我在不同动态库代码中调用它)
我个人的理解是:
单例依赖静态内存,静态内存需要在编译阶段实例化,而模板类在编译阶段并不能确定实例为何种类型,只能在运行时实例化,所以不同的动态库中无法识别单例的唯一实例,它们会各自重新实例化一个新的实例

...全文
104 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2020-08-04
  • 打赏
  • 举报
回复
编译链接什么的,不能跨越链接单元。exe、dll是不同的链接单元。 不要和单例扯一起。
真相重于对错 2020-08-04
  • 打赏
  • 举报
回复
你得理解基本不对,只有一条是对的就是dll之间要共享一块内存需要特殊处理。

64,667

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧