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

C++之竹

無論是太陽下,還是風(fēng)雨中,都要成長!

常用鏈接

統(tǒng)計(jì)

最新評論

Singleton模式——C++應(yīng)用(三)

前面對C++的Singleton模式的探討還都是針對通過靜態(tài)變量來創(chuàng)建對象。但學(xué)習(xí)嘛,多走點(diǎn)總不是壞事。

接下來就來看看通過 new 來創(chuàng)建單件對象的單件類設(shè)計(jì)。既然是用 new 來創(chuàng)建了,那自然就不能忽略需要用 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 來分配和創(chuàng)建單件對象,在對象的釋放上,也統(tǒng)一的使用Release函數(shù)封裝了delete操作,并手動調(diào)用。但A的單件和C的單件又是不同的,這個不同就在于 A 是通過將 new 出來的對象指針賦給成員變量,而 C 則將 new 出來的對象指針給了局部靜態(tài)變量。可別小看了這個區(qū)別哦!!就因?yàn)檫@一不同,結(jié)果 A 不是線程安全的,而 C 卻是線程安全的。當(dāng)然,也可以通過使用臨界區(qū)、互斥量等來是 A 變?yōu)榫€程安全,可是,該在什么時候去初始化臨界區(qū)或創(chuàng)建互斥量對象等呢?以臨界區(qū)為例,按常規(guī)的在 main 的頭部進(jìn)行臨界區(qū)的初始化,末尾則進(jìn)行臨界區(qū)的刪除;但是很不幸,程序崩潰了!!因?yàn)槿肿兞吭跇?gòu)造是調(diào)用了單件A,而單件A創(chuàng)建用到了臨界區(qū),可這是臨界區(qū)卻還沒有初始化。
那么將這臨界區(qū)的初始化放到A的構(gòu)造呢?一樣使用先去初始化。
放到A::GetInstance()內(nèi)呢?影響效率,且存在重復(fù)初始化。

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

——看來,從線程安全考慮,單件類A的設(shè)計(jì)應(yīng)當(dāng)被否決了。

 [單件類對象的釋放]

 撇開線程安全問題不看,就上面的Demo,我們將會發(fā)現(xiàn)另一個嚴(yán)重問題——何時才能調(diào)用A和C的Release方法,釋放A和C的單件對象呢?如果,是如Demo中那樣,在main函數(shù)末尾進(jìn)行釋放,那么因?yàn)轭怋的幾個全局對象的析構(gòu),將發(fā)生如下的糟糕結(jié)果:

  • 單件對象A又被再次重新分配,但卻未能得到再次重新分配,從而造成內(nèi)存泄露。事實(shí)上,對象的內(nèi)部數(shù)據(jù)也已不再是我們所需要的數(shù)據(jù)了。
  • 單件對象C,則因?yàn)槭莝tatic而不會再次分配,所以在B的全局對象析構(gòu)中,將會使用已經(jīng)析構(gòu)了的單件C。

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

 

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲高清在线观看一区| 这里只有精品电影| 精品白丝av| 国产精品国色综合久久| 欧美成人一区二区三区| 久久激情五月激情| 欧美一区二区三区四区在线| 亚洲一区影音先锋| 亚洲影院色在线观看免费| 久久婷婷蜜乳一本欲蜜臀| 欧美在线亚洲| 欧美一区日本一区韩国一区| 亚洲综合好骚| 亚洲欧美第一页| 在线午夜精品自拍| 亚洲视频一区在线观看| 亚洲午夜久久久久久久久电影院 | 国产美女一区二区| 国产精品久久久一区麻豆最新章节| 欧美日韩亚洲一区二区三区在线| 欧美精品日韩| 美女免费视频一区| 欧美久久九九| 国产精品私房写真福利视频| 国产香蕉久久精品综合网| 怡红院精品视频| 亚洲精品一区二区三区99| 一区二区三区国产盗摄| 亚洲尤物在线视频观看| 久久精品91久久香蕉加勒比 | 一本一本久久| 性色一区二区三区| 久久成人综合网| 女人天堂亚洲aⅴ在线观看| 欧美+亚洲+精品+三区| 欧美黄在线观看| 一本久道久久综合婷婷鲸鱼| 性色av香蕉一区二区| 欧美成人免费全部| 欧美69视频| 国产精品美女www爽爽爽视频| 好吊日精品视频| 中文精品视频| 欧美xart系列在线观看| 一区二区国产日产| 久久久人人人| 欧美日本在线看| 韩国三级在线一区| 亚洲在线观看| 亚洲欧洲日本一区二区三区| 亚洲视频欧美在线| 欧美福利专区| 国产综合视频| 亚洲在线中文字幕| 欧美激情a∨在线视频播放| 亚洲在线视频| 欧美日韩在线观看一区二区| 亚洲国产另类精品专区| 久久九九免费视频| 亚洲一区激情| 欧美成人免费全部| 韩日成人av| 欧美中文在线视频| 一区二区三区视频在线播放| 欧美99久久| 亚洲第一免费播放区| 欧美一区二区三区在线视频| 麻豆精品一区二区av白丝在线| 欧美国产一区二区| 久久久久九九九| 国产综合18久久久久久| 欧美永久精品| 一区二区毛片| 国产精品高潮视频| 日韩视频在线一区二区| 亚洲国产精品第一区二区三区| 久久男人av资源网站| 国产一区二区黄| 亚洲午夜国产一区99re久久| 亚洲国产精品一区二区第一页| 欧美国产日本高清在线| 久久久精品国产一区二区三区| 国产综合在线看| 老司机成人在线视频| 久久只有精品| 亚洲国产精品激情在线观看| 欧美在线啊v| 久久精品国产清高在天天线 | 久久激情网站| 欧美亚洲一级片| 亚洲综合色噜噜狠狠| 国产精品毛片在线看| 欧美一级艳片视频免费观看| 亚洲午夜久久久久久久久电影网| 国产精品美女久久久久av超清| 午夜精品理论片| 亚洲一区二区三区高清不卡| 国产精品专区h在线观看| 久久久www| 亚洲欧美日韩国产综合精品二区 | 在线高清一区| 亚洲第一天堂av| 欧美人妖另类| 午夜视频一区二区| 在线中文字幕一区| 伊人婷婷久久| 亚洲老司机av| 国外成人免费视频| 在线亚洲欧美视频| 欧美综合77777色婷婷| 亚洲国产精品成人久久综合一区| 亚洲三级免费| 国产欧美日韩亚洲精品| 亚洲欧美成人综合| 久久久亚洲国产美女国产盗摄| 亚洲精品裸体| 亚洲欧美日韩精品久久亚洲区| 亚洲国产精品久久久久久女王| 亚洲精品少妇网址| 影音先锋久久| 亚洲欧洲99久久| 亚洲一区二区三区四区五区黄| 欧美第一黄色网| 亚洲国产精品www| 亚洲国产精品va在线看黑人动漫| 香蕉亚洲视频| 久久精品在这里| 国产色产综合产在线视频| 一区二区三区高清在线| 亚洲天堂成人在线视频| 欧美日韩精品伦理作品在线免费观看| 欧美国产日产韩国视频| 在线观看欧美视频| 另类av一区二区| 欧美激情视频给我| 亚洲精品欧美日韩| 欧美日本韩国一区| 99精品视频免费在线观看| 中文国产一区| 国产精品一二三四| 久久9热精品视频| 免费av成人在线| 亚洲精品麻豆| 欧美午夜在线视频| 亚洲欧美日韩国产一区| 久久综合九色99| 亚洲精品国精品久久99热| 欧美日本二区| 亚洲一区二区四区| 久久久久综合网| 亚洲欧洲精品天堂一级| 欧美日韩国产在线播放网站| 在线一区二区日韩| 久久国产88| 欧美视频在线一区二区三区| 亚洲欧美卡通另类91av | 欧美日韩精品一区二区| 一区二区免费在线观看| 亚洲欧美日韩一区在线| 国产一区视频在线观看免费| 麻豆精品国产91久久久久久| 亚洲精品日韩综合观看成人91| 亚洲婷婷综合色高清在线| 国产欧美日本| 欧美成人自拍视频| 午夜精品区一区二区三| 欧美高清一区| 欧美在线高清| 亚洲精品一区二区三区四区高清 | 女同一区二区| 在线一区视频| 欧美黄污视频| 羞羞色国产精品| 亚洲韩国日本中文字幕| 国产精品国产精品| 毛片av中文字幕一区二区| 中文精品视频一区二区在线观看| 久久精品中文| 一级日韩一区在线观看| 国模大胆一区二区三区| 欧美日韩三级| 久久全球大尺度高清视频| 亚洲精品在线视频| 久久天堂av综合合色| 亚洲欧美成人一区二区三区| 亚洲韩国一区二区三区| 国产性做久久久久久| 欧美日韩一区综合| 欧美第十八页| 久久一区亚洲| 欧美一区二区三区四区在线| 99re66热这里只有精品4| 免费欧美高清视频| 香蕉久久国产| 亚洲一区在线免费| 一本一本久久a久久精品牛牛影视| 亚洲电影中文字幕| 国产在线拍揄自揄视频不卡99| 国产精品美女主播在线观看纯欲| 欧美日本国产视频|