1.作用 單例模式目的就是為了保證一個類只有一個實例。 2.原理 (1)私有靜態指針變量實現:使用類的私有靜態指針變量指向類的唯一實例,並用一個公有的靜態方法獲取該實例。 (2)靜態局部變量實現:在公有靜方法中定義指向該類的一個靜態局部變量,並返回該靜態局部變量。 3.實現 3.1.私有靜態指針變量實現 3.1.1.特點 A.它有唯一一個私有的、指向類的的靜態成員指針m_pInstance。 B.它有一個公有的暴露該單例的靜態方法getInstance。 C.構造函數是私有的,避免從其他地方創建該類實例。 D.定義單例類中私有內嵌類CGarbo,在其析構函數中釋放單例指針。 E.定義CGarbo類的一個實例作為靜態成員變量,利用程序結束系統會自動析構所有全局變量的特性來自動釋放單例指針。 3.1.2.示例 [cpp] //Singleton1.h #pragma once class CSingleton1 { public: static CSingleton1* getInstance() { if ( m_pInstance == NULL ) m_pInstance = new CSingleton1(); return m_pInstance; } private: CSingleton1(); static CSingleton1* m_pInstance; class CGarbo//唯一的作用就是在析構時刪除m_pInstance { public: ~CGarbo() { if (CSingleton1::m_pInstance!=NULL) { delete CSingleton1::m_pInstance; } } }; static CGarbo m_garbo;//程序結束,系統會自動調用其析構函數 }; [cpp] //Singleton1.cpp #include "StdAfx.h" #include "Singleton1.h" CSingleton1* CSingleton1::m_pInstance=NULL;//靜態成員變量的定義 CSingleton1::CGarbo CSingleton1::m_garbo;//內嵌類靜態成員變量的定義 CSingleton1::CSingleton1() { } 3.1.3.內存洩漏檢測 通過vld進行檢測內存洩漏,當未添加CGarbo類,內存洩漏一個字節,即該空單例類實例所占的1個字節,如下。添加CGarbo類及靜態成員變量後,內存無洩漏。 [html] view plaincopy Visual Leak Detector Version 2.3 installed. WARNING: Visual Leak Detector detected memory leaks! ---------- Block 1 at 0x003AC038: 1 bytes ---------- Call Stack: d:\microsoft visual studio 9.0\projects\testcpp\testsingleton\singleton1.h (11): TestSingleton.exe!CSingleton1::getInstance + 0x7 bytes d:\microsoft visual studio 9.0\projects\testcpp\testsingleton\testsingleton.cpp (12): TestSingleton.exe!wmain f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (583): TestSingleton.exe!__tmainCRTStartup + 0x19 bytes f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): TestSingleton.exe!wmainCRTStartup 0x7C81776F (File and line number not available): kernel32.dll!RegisterWaitForInputIdle + 0x49 bytes Data: CD 3.2.靜態局部變量實現 3.2.1.特點 A.無需考慮內存釋放問題。 B.禁用類拷貝和類賦值。 3.2.2.示例 [cpp] //Singleton2.h #pragma once class CSingleton2 { public: static CSingleton2& getInstance() { static CSingleton2 instance; return instance; } private: CSingleton2(); CSingleton2(const CSingleton2 &); CSingleton2 & operator = (const CSingleton2 &); }; 3.2.3.無內存洩漏相關問題