局部靜態變量
優點: 不需要考慮資源釋放,程序結束時,靜態區資源自動釋放
#ifndef SINGLETON_H
#define SINGLETON_H
class Singleton
{
public:
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
private:
Singleton() {};
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
#endif //SINGLETON_H
#ifndef SINGLETON_H
#define SINGLETON_H
class Singleton
{
public:
static Singleton* getInstance()
{
static Singleton instance;
return &instance;
}
private:
Singleton() {};
};
#endif //SINGLETON_H
懶漢式
第一次調用時才初始化,避免內存浪費,但是爲保證多線程下安全,必須加鎖
#ifndef SINGLETON_H
#define SINGLETON_H
#inlcude <mutex>
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton() {};
private:
static Singleton *m_pSingleton;
static mutex m_mutex;
};
#endif //SINGLETON_H
//singleton.cpp
#include "singleton.h"
using namespace std;
Singleton *Singleton::m_pSingleton = NULL;
mutex Singleton::m_mutex;
Singleton *Singleton::getInstance()
{
if (m_pSingleton == NULL)
{
Lock_guard<mutex> lock(m_mutex);
if (m_pSingleton == NULL)
{
m_pSingleton = new Singleton();
}
}
return m_pSingleton;
}
餓漢式
類加載時就初始化,會浪費內存,但線程安全
#ifndef SINGLETON_H
#define SINGLETON_H
#inlcude <mutex>
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton() {};
private:
static Singleton *m_pSingleton;
};
#endif //SINGLETON_H
//singleton.cpp
#include "singleton.h"
using namespace std;
Singleton *Singleton::m_pSingleton = new Singleton();
Singleton *Singleton::getInstance()
{
return m_pSingleton;
}
資源釋放
誰分配,誰釋放。。。這裏懶漢與餓漢式都需要進行資源釋放。可利用靜態局部變量由程序自動釋放特點來進行
#ifndef SINGLETON_H
#define SINGLETON_H
#inlcude <mutex>
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton() {};
private:
static Singleton *m_pSingleton;
class GC
{
public:
~GC()
{
if (m_pSingleton!=NULL)
{
delete m_pSingleton;
m_pSingleton = NULL;
}
}
static GC gc;
};
};
#endif //SINGLETON_H
//singleton.cpp
Singleton::GC Singleton::GC::gc; //添加此行進行static 變量定義