Qt 单例模式的实现

1、静态对象

static MyClass* MyClass::Instance()

{

static MyClass inst;

return &inst;

}

过去很长一段时间一直都这么写,简单粗暴有效。但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer和线程锁QMutex,改成了需要时才动态初始化的模式:

2、动态初始化

static MyClass* MyClass::Instance()

{

static QMutex mutex;

static QScopedPointer<MyClass> inst;

if (Q_UNLIKELY(!inst)) {

mutex.lock();

if (!inst) {

inst.reset(new MyClass);

}

mutex.unlock();

}

return inst.data();

}

既保证了线程安全又防止了内存泄漏,效率也没降低太多,简直完美。

可惜每次都要重复这么几行实在麻烦,于是写了一个模板类:

3、模板类

复制代码
使用时:MyClass* inst = Singleton<MyClass>::Instance();