單例是c++中比較常用的設計模式,在遊戲伺服器開發中很多全域性管理器都是用單例實現。其實單例不析構也不會有任何問題,但是有的時候需要查記憶體洩漏問題那麼單例不析構會導致工具報錯太多,不利於查詢問題。普通單例沒有通用性,在我參與的所有遊戲專案中都是模板單例,網上有很多單例析構的例子,但是我幾乎沒有找到有模板單例析構正常的**。模板單例析構**如下:
template
class csingleton
return *m_pinstance;
}protected:
static t *m_pinstance;
protected:
csingleton(){}
~csingleton(){}
private:
csingleton(const csingleton &);
csingleton& operator = (const csingleton &);
private:
class cautogc}};
static cautogc m_gc;
static cautogc& getgc()
};template
t* csingleton::m_pinstance = null;
template
typename csingleton::cautogc csingleton::m_gc;
class ctest:public csingleton
~ctest()
};class ctestex
~ctestex()
};void threadrun()
int main(int argc, char* argv)
{threadrun();
return 0;
csingleton內中有乙個私有的內部類,在程序結束之後m_gc成員變數的自動析構會析構單例,其中關鍵的地方是csingleton::getgc();這行**的呼叫,沒有這行**那麼m_gc成員變數沒有任何地方使用那麼將不會被構造,沒有構造那就更不用說析構了。threadrun()函式中展示了兩種單例使用的方法。在遊戲伺服器開發中都比較常用。由於這兩種使用方法所以csingleton::getgc()這行**不能用m_pinstance->getgc();替換。
其實有的專案中還會使用執行緒本地儲存的單例,這種單例要想使用上面的自動析構要支援c++11中thread_local的編譯器才行。大家可以在專案中試試。只有自己實踐之後才會有更深刻的體會。c++程式設計書籍很多都是古老的了,現在很多東西都發生了變化,也就是說很多書上的知識已經不適用或者說就是錯誤的了。
C 單例模式及其析構
utilities.h ifndef utilities h define utilities h include class utilities static garbo m garbo endif utilities h utilities.cpp include utilities.h qmu...
單例模式 私有析構函式 new過載
對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務 乙個系統只能有乙個視窗管理器或檔案系統 乙個系統只能有乙個計時工具或id 序號 生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如...
單例模式下中map成員變數析構問題
在乙個全域性的單例模式下有乙個包含有gpucontext的map,由於全域性變數是應用程式退出時才進行析構退出,而裡面包含有gpu context時可能由於析構的不確定性導致gpu報錯。一般需要在main函式退出之前進行乙個release釋放map中的gpucontext 保證 gpu contex...