C++ 單例模式的實現及資源釋放

局部靜態變量

優點: 不需要考慮資源釋放,程序結束時,靜態區資源自動釋放

#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 變量定義
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章