版权声明:本文为博主原创文章,未经博主允许不得转载。文章中有连接失效或是技术谬误的地方,请与我联系。 https://blog.csdn.net/luchengtao11/article/details/82379039
Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <mutex>
/****************************第一种实现*******************************************/
/*
懒汉
1.线程不安全
2.内存泄露
3.用到时被初始化
3.对象在堆中
*/
class CSingleton1
{
public:
static CSingleton1* Instance();
private:
CSingleton1(const CSingleton1&);
CSingleton1 & operator =(const CSingleton1 &);
static CSingleton1 * instance;
CSingleton1();
};
/****************************第二种实现*******************************************/
/*
饿汉
1、一开始便初始化
2、析构函数完成垃圾回收
3、线程安全
4、对象在堆中
*/
class CSingleton2
{
public:
static CSingleton2 * Instance();
class CGarbo
{
public:
~CGarbo();
};
private:
static CSingleton2 *instance;
static CGarbo garbo;
};
/****************************第三种实现******************************************
1.一开始便初始化
2.对象在静态区
3.程序结束时自动释放静态区的成员变量
4.线程安全
*/
class CSingleton3
{
public:
static CSingleton3 * Instance();
private:
CSingleton3();
static CSingleton3 instance;
};
/****************************第四种实现******************************************
1.运行时生成
2.线程安全
3.对象在堆中
4.程序结束自动释放
*/
class CSingleton4
{
public:
static CSingleton4 * Instance();
private:
CSingleton4();
};
/****************************第五种实现******************************************
1.运行时生成
2.线程安全
3.对象在堆中
4.程序结束自动释放
*/
class CSingleton5
{
public:
static CSingleton5* Instance();
private:
static CSingleton5* instance;
static std::mutex mutex_;
CSingleton5();
};
#endif // !_SINGLETON_H_
Singleton.cpp
#include <iostream>
#include "Singleton.h"
CSingleton1 * CSingleton1::Instance()
{
if (instance == NULL)
{
instance = new CSingleton1();
}
return instance;
}
CSingleton1::CSingleton1()
{
}
//私有静态成员变量要手动初始化
CSingleton1 * CSingleton1::instance = NULL;//此句一定要写,否则会引起无法解析的外部符号错误
CSingleton2 * CSingleton2::Instance()
{
return instance;
}
CSingleton2::CGarbo::~CGarbo()
{
if (instance)
{
delete instance;
}
}
CSingleton2 * CSingleton2::instance = new CSingleton2();
CSingleton2::CGarbo CSingleton2::garbo;
CSingleton3 * CSingleton3::Instance()
{
return &instance;
}
CSingleton3::CSingleton3() {};
CSingleton3 CSingleton3::instance;
CSingleton4 * CSingleton4::Instance()
{
static CSingleton4 instance;
return &instance;
}
CSingleton4::CSingleton4() {};
CSingleton5::CSingleton5() {};
CSingleton5* CSingleton5::instance=NULL;
std::mutex CSingleton5::mutex_;
CSingleton5* CSingleton5::Instance()
{
if (instance==NULL)
{
mutex_.lock();
if (instance == NULL)//第二次
{
instance = new CSingleton5();
}
mutex_.unlock();
}
return instance;
}