更新时间: 2019-01-10 13:14:20
更新时间: 2020-05-15 17:58:19
// singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#ifdef _MSC_BUILD
#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理
#endif
#include <iostream>
#include <mutex>
class Singleton {
public:
inline static Singleton *getInstance(){ //
if(nullptr == instance) {
std::lock_guard<std::mutex> lock(mutex); // 自解锁
if(nullptr == instance) {
Singleton *instance_ = new Singleton(); // 很重要
instance = instance_;
}
}
return instance;
}
private:
Singleton(); // 私有保护构造函数
~Singleton();
static Singleton *instance;
static std::mutex mutex; // 懒汉式 DCL 机制
class GC { // GC机制 自动释放Singlenton
public:
static GC gc; // 用于释放Singlenton
~GC() { // 可以在这里销毁所有的资源
if(nullptr!=instance){
delete instance;
instance=nullptr;
}
}
};
};
#endif // SINGLETON_H
// singleton.cpp
#ifdef _MSC_BUILD
#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理
#endif
#include <QDebug>
#include "singleton.h"
Singleton *Singleton::instance=nullptr;
std::mutex Singleton::mutex;
Singleton::Singleton() {
qDebug() << "构造:" << __FUNCTION__;
}
Singleton::~Singleton() {
qDebug() << "析构:" << __FUNCTION__;
}
// main
#ifdef _MSC_BUILD
#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理
#endif
#include "singleton.h"
Singleton::GC Singleton::GC::gc; // 重要 GC自动释放Singleton
int main(int argc,char *argv[]) {
Singleton *singleton1=Singleton::getInstance();
Singleton *singleton2=Singleton::getInstance();
std::cout << singleton1 == singleton2 << std::endl; // true
return 0;
}