單例模式的構造和析構問題

來源:互聯網
上載者:User
今天再看代碼的過程中遇到一個問題,師哥指點後自己算是初步學習了下,現在記錄一下我之前的知識盲點:單例模式(GOF23中有介紹)一個簡單的單例模式的實現過程:一.首先看代碼的實現:class CSingleMode

{public:static CSingleMode* Instance(){if(m_pMemoryPools == NULL){m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));m_CSingleMode->Init();}return *m_pMemoryPools;}public:~CSingleMode(void);private:CSingleMode(void);void Close();void Init();private:static CSingleMode* m_CSingleMode;

};

二.單例模式的基本構成需要:

1.它有一個指唯一執行個體的靜態指標m_CSingleMode,並且是私人的。

2.它有一個公有的函數,可以擷取這個唯一的執行個體,並在需要的時候建立該執行個體:本例中就是static CSingleMode* Instance()函數實現了單例的構造和初始化;

3.它的建構函式是私人的,這樣就不能從別處建立該類的執行個體:CSingleMode(void);

三.單例模式的清理:

所謂的單例就是,使用Instance函數之後不會再建立這個類的執行個體了,因為他是static的,然後就可以通過它的私人變數m_CSingleMode來使用這個類提供的功能和資源了;

那麼m_CSingleMode指向的空間什麼時候釋放呢?更嚴重的問題是,這個執行個體的析構操作什麼時候執行?

如果在這個建構函式中申請了資源或者開啟了檔案,網路等的,那麼最穩妥的就是在析構的時候關閉這些資源,或者清除申請的資源,這樣才能保證程式的正常運行,那麼我們可以使用一個私人的函數來完成這個功能了:

void CSingleMode ::Close(){if (CSingleMode ::m_CSingleMode)delete CSingleMode ::m_CSingleMode;}~CSingleMode(void){close();}這樣在程式退出的時候就會自動調用解構函式,然後用close()這個類的私人函數完成清理工作了,這樣就可以放心的使用單例提供的資源了。或者使用一個內嵌的清理類來完成這個功能:class CSingleMode {public:static CSingleMode* Instance(){if(m_pMemoryPools == NULL){m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));m_CSingleMode->Init();}return *m_pMemoryPools;}public:~CSingleMode(void);private:CSingleMode(void);void Init();static CSingleMode* m_CSingleMode;//類Cleanall被定義為CSingleMode的私人內嵌類,以防該類被在其它地方濫用class Cleanall{public:~Cleanall(){if (CSingleMode ::m_CSingleMode)

delete CSingleMode ::m_CSingleMode;}}static
Cleanall Cleanall;//定義一個靜態成員,在程式結束時系統會調用它的解構函式};這樣的好處在於:

1.在單例類內部定義專有的嵌套類。

2.在單例類內定義私人的專門用於釋放的靜態成員。

3.利用程式在結束時析構全域變數的特性,選擇最終的釋放時機。

4.使用C++單例模式的代碼不需要任何操作,不必關心對象的釋放。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.