青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++之竹

無論是太陽下,還是風雨中,都要成長!

常用鏈接

統計

最新評論

Singleton模式——C++應用(三)

前面對C++的Singleton模式的探討還都是針對通過靜態變量來創建對象。但學習嘛,多走點總不是壞事。

接下來就來看看通過 new 來創建單件對象的單件類設計。既然是用 new 來創建了,那自然就不能忽略需要用 delete 來釋放。

好了,先來看看代碼:

  1// Singleton demo_2: Singleton instance is created by new.
  2// [delete instance manually]
  3
  4#include <Windows.h>
  5#include <iostream>
  6
  7class A 
  8{
  9private:
 10    static A* ms_pInstance;
 11
 12public:
 13    static A& GetInstance();
 14    static void Release();
 15
 16private:
 17    A() : m_nStat1(-1), m_nStat2(-1{
 18        m_nStat1 = 0;
 19        std::cout << "Construct A" << std::endl;
 20        m_nStat2 = 0;
 21    }

 22    A(const A&);
 23
 24public:
 25    ~A() {
 26        m_nStat1 = 0;
 27        std::cout << "Destruct A" << std::endl;
 28        m_nStat2 = 0;
 29    }

 30
 31    void Do() {
 32        ++m_nStat1;
 33        ++m_nStat2;
 34        std::cout << "Called Do() by object of A. [" 
 35            << m_nStat1 << "" 
 36            << m_nStat2 << "]" 
 37            << std::endl;
 38    }

 39
 40private:
 41    int m_nStat1;
 42    int m_nStat2;
 43}
;
 44
 45class C
 46{
 47
 48public:
 49    static C& GetInstance();
 50    static void Release();
 51
 52private:
 53    C() : m_nStat(-1{
 54        std::cout << "Construct C" << std::endl;
 55        m_nStat = 0;
 56    }

 57    C(const C&);
 58
 59public:
 60    ~C() {
 61        std::cout << "Destruct C" << std::endl;
 62        m_nStat = 0;
 63    }

 64
 65    void Do() {
 66        ++m_nStat;
 67        std::cout << "Called Do() by object of C. [" 
 68            << m_nStat << "]" 
 69            << std::endl;
 70    }

 71
 72private:
 73    int m_nStat;
 74}
;
 75
 76class B
 77{
 78public:
 79    B(int nID) : m_nID(nID) {
 80        std::cout << "Construct B: " << m_nID << std::endl;
 81        A::GetInstance().Do();
 82        C::GetInstance().Do();
 83    }

 84    ~B() {
 85        std::cout << "Destruct B: " << m_nID << std::endl;
 86        A::GetInstance().Do();
 87        C::GetInstance().Do();
 88    }

 89
 90private:
 91    int m_nID;
 92}
;
 93
 94//CRITICAL_SECTION g_cs; // used for supporting multithreading to singleton.
 95
 96static B gs_B0(0);
 97B g_B1(1);
 98
 99A* A::ms_pInstance = NULL;
100A& A::GetInstance()
101{
102    if (NULL == ms_pInstance)
103    {
104        //EnterCriticalSection(&g_cs);
105        //if (NULL == ms_pInstance)
106        //{
107            ms_pInstance = new A;
108        //}
109        //LeaveCriticalSection(&g_cs);
110    }

111
112    return *ms_pInstance;
113}

114
115void A::Release()
116{
117    std::cout << "A::Release()" << std::endl;
118    if (ms_pInstance != NULL)
119    {
120        delete ms_pInstance;
121        ms_pInstance = NULL;
122    }

123}

124
125C& C::GetInstance()
126{
127    static C* s_pInstance = new C;
128
129    return *s_pInstance;
130}

131
132void C::Release()
133{
134    std::cout << "C::Release()" << std::endl;
135    delete &GetInstance();
136}

137
138static B gs_B2(2);
139B g_B3(3);
140
141int main(int argc, char * argv[])
142{
143    //InitializeCriticalSection(&g_cs);
144
145    std::cout << "Enter main" << std::endl;
146    A::GetInstance().Do();
147    C::GetInstance().Do();
148
149    A::Release();
150    C::Release();
151
152    //DeleteCriticalSection(&g_cs);
153    system("pause");
154    return 0;
155}

156

[單件類的線程安全性]

代碼中,類A和C都是單件類,且都是通過 new 來分配和創建單件對象,在對象的釋放上,也統一的使用Release函數封裝了delete操作,并手動調用。但A的單件和C的單件又是不同的,這個不同就在于 A 是通過將 new 出來的對象指針賦給成員變量,而 C 則將 new 出來的對象指針給了局部靜態變量。可別小看了這個區別哦!!就因為這一不同,結果 A 不是線程安全的,而 C 卻是線程安全的。當然,也可以通過使用臨界區、互斥量等來是 A 變為線程安全,可是,該在什么時候去初始化臨界區或創建互斥量對象等呢?以臨界區為例,按常規的在 main 的頭部進行臨界區的初始化,末尾則進行臨界區的刪除;但是很不幸,程序崩潰了!!因為全局變量在構造是調用了單件A,而單件A創建用到了臨界區,可這是臨界區卻還沒有初始化。
那么將這臨界區的初始化放到A的構造呢?一樣使用先去初始化。
放到A::GetInstance()內呢?影響效率,且存在重復初始化。

放到B的構造呢?還是被反復多次初始化了……。而且,有非B類的更先構造并調用了單件A的全局對象呢?!

——看來,從線程安全考慮,單件類A的設計應當被否決了。

 [單件類對象的釋放]

 撇開線程安全問題不看,就上面的Demo,我們將會發現另一個嚴重問題——何時才能調用A和C的Release方法,釋放A和C的單件對象呢?如果,是如Demo中那樣,在main函數末尾進行釋放,那么因為類B的幾個全局對象的析構,將發生如下的糟糕結果:

  • 單件對象A又被再次重新分配,但卻未能得到再次重新分配,從而造成內存泄露。事實上,對象的內部數據也已不再是我們所需要的數據了。
  • 單件對象C,則因為是static而不會再次分配,所以在B的全局對象析構中,將會使用已經析構了的單件C。

但是,如果我們把Release放入B的析構中,則A將被多次的分配和釋放,而C則被多次調用析構。無奈咯,考慮釋放的困難,這里的A和C的單件類設計方式看來也都還是否決的好!~

 

posted on 2012-03-13 00:55 青碧竹 閱讀(265) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久88精品综合| 亚洲国产婷婷综合在线精品 | 欧美日韩中国免费专区在线看| 久久狠狠一本精品综合网| 欧美一区二区日韩| 久久久久久九九九九| 看欧美日韩国产| 欧美国产三区| 欧美激情一区| 亚洲第一精品夜夜躁人人爽| 久久久久久香蕉网| 狂野欧美激情性xxxx欧美| 麻豆精品91| 亚洲乱亚洲高清| 亚洲欧洲99久久| 美日韩丰满少妇在线观看| 欧美日韩国产黄| 国产亚洲精品久| 亚洲精品你懂的| 午夜精品电影| 欧美成人69| 中文在线资源观看网站视频免费不卡 | 性亚洲最疯狂xxxx高清| 久久婷婷一区| 国产精品v欧美精品v日韩精品| 黑人巨大精品欧美一区二区小视频| 亚洲精品女人| 久久婷婷激情| 亚洲一级网站| 欧美精品粉嫩高潮一区二区 | 久久久国产一区二区| 亚洲国产精品成人精品| 亚洲欧美久久| 欧美精品一区二区在线观看 | 欧美精品一区在线发布| 国产日韩欧美精品综合| 夜夜嗨一区二区| 免费短视频成人日韩| 亚洲线精品一区二区三区八戒| 美国十次了思思久久精品导航| 国产精品日韩久久久久| 一本久久综合| 亚洲电影专区| 久久亚洲精品一区二区| 国产日韩欧美精品综合| 亚洲永久字幕| 亚洲精品在线视频观看| 欧美xx视频| 影音先锋亚洲视频| 久久嫩草精品久久久久| 亚洲永久在线观看| 欧美日韩免费观看一区二区三区| 欧美+亚洲+精品+三区| 韩国av一区二区三区| 午夜在线a亚洲v天堂网2018| 亚洲美女黄色| 欧美日韩一区二区国产| 夜夜嗨av一区二区三区四季av| 亚洲国产精品成人久久综合一区 | 亚洲小视频在线| 欧美色欧美亚洲另类二区| 亚洲人成在线观看一区二区| 欧美高潮视频| 欧美成人网在线| 亚洲乱码日产精品bd| 亚洲国产另类 国产精品国产免费| 久久综合给合久久狠狠色| 亚洲高清视频的网址| 亚洲成人在线视频播放| 欧美高清在线视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲二区在线观看| 欧美日韩爆操| 亚洲免费一区二区| 欧美一区深夜视频| 在线电影一区| 亚洲激情成人网| 欧美特黄一级大片| 久久国产精品电影| 久久婷婷人人澡人人喊人人爽| 亚洲精品免费观看| 亚洲另类春色国产| 国产九区一区在线| 欧美国产日韩亚洲一区| 欧美日韩国产一区二区三区| 午夜视频一区在线观看| 久久精品免视看| 亚洲最新在线视频| 久久成人免费视频| 亚洲免费av网站| 性刺激综合网| 亚洲毛片一区| 欧美一区二区三区婷婷月色| 亚洲人成网站999久久久综合| 一区二区三区黄色| 一区二区三区在线免费播放| 亚洲精品偷拍| 国产一区二区三区免费不卡| 亚洲国产三级| 国产字幕视频一区二区| 日韩视频中文| 1024国产精品| 亚洲一区不卡| 亚洲欧洲精品一区二区精品久久久| 亚洲天堂黄色| 亚洲精品一区中文| 午夜精品一区二区三区在线播放| 91久久久国产精品| 欧美一级在线亚洲天堂| 在线一区观看| 久久免费精品日本久久中文字幕| 国产精品99久久久久久久女警| 久久精品1区| 亚洲欧美精品在线观看| 一区二区三区欧美在线观看| 在线精品观看| 亚洲欧美日韩一区二区| 一本色道久久综合亚洲二区三区| 久久er99精品| 午夜一区不卡| 欧美日韩亚洲免费| 亚洲国产婷婷香蕉久久久久久| 国模套图日韩精品一区二区| 亚洲一区二区三区免费观看| 一本一本久久a久久精品牛牛影视| 久久久久在线观看| 久久久福利视频| 国产婷婷色一区二区三区| 一区二区精品在线观看| 日韩午夜三级在线| 欧美国产日韩二区| 欧美激情第10页| 亚洲国产婷婷| 葵司免费一区二区三区四区五区| 久久不射电影网| 国产欧美一区二区三区在线老狼 | 欧美精品18+| 欧美国产免费| 91久久精品美女| 美日韩在线观看| 欧美激情精品久久久| 亚洲精品免费电影| 欧美日韩黄色一区二区| 99视频超级精品| 亚洲欧美另类国产| 国产欧美精品在线播放| 欧美在线www| 欧美mv日韩mv亚洲| 亚洲黑丝在线| 欧美日韩免费网站| 亚洲一区日韩在线| 久久精品国产久精国产思思| 国产综合av| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美激情久久久久| 宅男精品视频| 国产欧美一区二区精品秋霞影院| 性色av香蕉一区二区| 欧美成人免费在线视频| 欧美性理论片在线观看片免费| 亚洲影视九九影院在线观看| 久久人人爽爽爽人久久久| …久久精品99久久香蕉国产 | 欧美在线www| 欧美国产视频日韩| 久久免费视频观看| 久久最新视频| 一本久道久久久| 国产农村妇女毛片精品久久麻豆 | 欧美精品一线| 亚洲欧美精品| 欧美黑人在线观看| 欧美日韩裸体免费视频| 亚洲摸下面视频| 欧美va亚洲va日韩∨a综合色| 亚洲人成毛片在线播放女女| 国产精品v欧美精品v日韩 | 香蕉av777xxx色综合一区| 欧美午夜电影在线| 午夜影视日本亚洲欧洲精品| 欧美国产日韩a欧美在线观看| 亚洲一区二区视频在线| 激情综合电影网| 欧美日韩在线免费观看| 久久久999成人| 亚洲视频专区在线| 亚洲国产精品尤物yw在线观看| 欧美永久精品| 99精品欧美| 亚洲福利视频二区| 国产日韩欧美制服另类| 欧美日韩国产999| 免费h精品视频在线播放| 香蕉久久夜色精品国产使用方法| 亚洲三级影片| 欧美激情一区二区三区在线视频观看 | 99精品视频免费观看视频| 狼人社综合社区| 欧美在现视频| 亚洲欧美日韩在线|