原文連結:http://www.cppblog.com/jialisoft/archive/2012/09/26/192071.html
首先展示一個最簡單的單例模式例子,代碼如下:
- class NetworkService
- {
- public:
- // 對外提供的唯一方法函數,用於擷取唯一的對象指標
- static NetworkService* GetInstance()
- {
- if(m_pInstance == NULL)
- {
- m_pInstance = new NetworkService();
- }
- return m_pInstance;
- }
-
- private:
- // 建構函式設定為私人,禁止使用者另外建立對象
- NetworkService();
- static NetworkService* m_pInstance;
- };
//www.heatperss123.com
這程式看起來非常簡單,而且幾乎沒有什麼問題,然後直接使用NetworkService::GetInstance()就可以獲得對象指標了。不過這樣的程式實際隱含了個問題:這個唯一的對象應該在什麼時候被釋放呢?
一種方法,我們可以先實現一個析構自身資源的方法,然後通過GetInstance()來擷取對象自身,並調用這個方法來進行delete的操作。這樣的方法可行,不過實現方式並不好,至少來說,我們應該讓程式自己在合適的時候來釋放資源,而不是由外面的程式來調用這個操作。
那麼是否有更好的辦法來析構單例的對象呢?有,利用靜態變數的特點可以實現這樣的功能。我們知道,程式即將退出時,系統會自動析構所有的全域變數或靜態變數。而且,所有的類的靜態成員變數也會被自動析構。基於此,我們可以在單例類中定義一個這樣的靜態成員變數,它存在的目的就是當程式退出時,在解構函式中清除單例類的唯一執行個體。重新完善的代碼(參考自其他資料)如下所示,定義了一個Gargo的靜態成員:
- class NetworkService
- {
- public:
- // 對外提供的唯一方法函數,用於擷取唯一的對象指標
- static NetworkService* GetInstance()
- {
- if(m_pInstance == NULL)
- {
- m_pInstance = new NetworkService();
- }
- return m_pInstance;
- }
-
- private:
- // 建構函式設定為私人,禁止使用者另外建立對象
- NetworkService();
- static NetworkService* m_pInstance;
-
- // 實現私人內嵌類, 用於類NetworkService的對象資源的釋放
- class Garbo
- {
- public:
- ~Garbo()
- {
- if(NetworkService::m_pInstance)
- {
- delete m_pInstance;
- }
- }
- };
- // 程式運行結束時,系統會調用NetService的靜態成員garbo的解構函式,
- // 該系夠函數會刪除NetService類的唯一執行個體
- static Garbo garbo;
- };