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

C++之竹

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

常用鏈接

統計

最新評論

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

     前天,在看了《劍指Offer》中關于Singleton模式的一段內容后,就按耐不住對其在C++上完美實現的思考。書中這一講是針對C#的實現來講解的,因為C#的垃圾回收機制,其中那些個顯眼的[new]已無需程序員去手動釋放。但是,C++上確并不存在垃圾回收機制,程序員得手動[delete] [new]出來的內容,這就有了以下兩問:
  1. 何時釋放通過new所創建的Singleton對象?
  2. 如果不通過new、malloc等操作,是否能做到在第一次使用時才創建Singleton對象。

     在針對以上兩個問題做了一番思考和嘗試之后,終于有了成果。現呈現出來,供大家參考,也希望有更好妙招的朋友能不吝賜教。礙于連代碼帶文字,篇幅較長,所以我將分為四篇來講。那么,開始咯!^_^

 

     一開始,我先拿使用靜態成員變量的來實現的惰性單件來進行嘗試,寫了個Demo,一運行,O(∩_∩)O哈哈~,還真有意外的收獲呢!嗯~,抓緊時間,先把我的Demo上來給大家瞧瞧!~

  1// Singleton demo_0: Singleton instance is a static member of class.
  2
  3#include <Windows.h>
  4#include <iostream>
  5
  6class A 
  7{
  8private:
  9    static A ms_instance;
 10
 11public:
 12    static A& GetInstance() {
 13        return ms_instance;
 14    }

 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 B
 46{
 47public:
 48    B(int nID) : m_nID(nID) {
 49        std::cout << "Construct B: " << m_nID << std::endl;
 50        A::GetInstance().Do();
 51    }

 52    ~B() {
 53        std::cout << "Destruct B: " << m_nID << std::endl;
 54        A::GetInstance().Do();
 55    }

 56
 57private:
 58    int m_nID;
 59}
;
 60
 61class C
 62{
 63private:
 64    static C ms_instance;
 65
 66public:
 67    static C& GetInstance() {
 68        return ms_instance;
 69    }

 70
 71private:
 72    C() : m_nStat(-1{
 73        std::cout << "Construct C" << std::endl;
 74        m_nStat = 0;
 75    }

 76    C(const C&);
 77
 78public:
 79    ~C() {
 80        std::cout << "Destruct C" << std::endl;
 81        m_nStat = 0;
 82    }

 83
 84    void Do() {
 85        ++m_nStat;
 86        std::cout << "Called Do() by object of C. [" 
 87            << m_nStat << "]" 
 88            << std::endl;
 89    }

 90
 91private:
 92    int m_nStat;
 93}
;
 94
 95static B gs_B0(0);
 96B g_B1(1);
 97A A::ms_instance;
 98C C::ms_instance;
 99static B gs_B2(2);
100B g_B3(3);
101
102int main(int argc, char * argv[])
103{
104    std::cout << "Enter main" << std::endl;
105    A::GetInstance().Do();
106    C::GetInstance().Do();
107
108    system("pause");
109    return 0;
110}

為了能夠分析得細致些,Demo寫得長了點,見諒咯!~

    嗯,對了,還有運行結果:

仔細看看結果,有沒覺得這結果很出乎意料啊?!!(順便提下,我用的編譯工具是Visual C++ 2010)

從這個運行結果,對通過靜態成員實現的惰性單件,我得到了以下兩點:

  1. 對于定義在單件對象之前的全局或靜態全局對象,雖然單件對象還是會在調用前及時構造,但構造函數內的初始化操作卻可能在需要使用時還未能執行完全。
    如:std::cout 就會使得單件對象的構造函數調用被暫停(單件的其他操作還能繼續調用),直到單件之前的全局或靜態全局的構造函數全執行完了,才能繼續執行。【*這個原因還請有知道的高手能賜教。
  2. 對于定義于單件對象之后的全局或靜態全局對象,如果在析構中調用了單件,就會使得單件在釋放后又被再次重新創建使用。當然,這時單件內所存的數據已跟之前毫無關聯了。

因此,我要奉勸各位開發者,如果在你的全局或靜態全局對象的構造或析構方法中調用某個單件,那么對該單件的實現就不要以靜態成員來惰性地實現。

 

posted on 2012-03-12 02:04 青碧竹 閱讀(303) 評論(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>
            欧美一乱一性一交一视频| 最新成人在线| 国产精品你懂的在线| 国产欧美一区二区三区沐欲| 99国产精品久久久| 欧美一区二区视频在线观看2020| 久久亚洲美女| 久久激五月天综合精品| 欧美日韩亚洲综合一区| 在线日韩视频| 免费高清在线一区| 亚洲一区三区在线观看| 国产精品久久久久久久久动漫| 亚洲国产老妈| 久久综合婷婷| 蜜臀a∨国产成人精品| 国产午夜精品一区理论片飘花| 亚洲欧美在线免费| 亚洲美女黄色| 欧美激情第4页| 亚洲一二三区视频在线观看| 欧美激情精品久久久六区热门| 久久人人看视频| 国内精品久久久久影院色| 亚洲男同1069视频| 亚洲欧美一区二区三区极速播放 | 亚洲综合激情| 一区二区三区鲁丝不卡| 欧美久久久久| 99综合在线| 午夜久久福利| 国产毛片一区| 欧美高清视频一区二区三区在线观看| 久久aⅴ国产紧身牛仔裤| 国产午夜精品视频| 欧美激情自拍| 欧美精品自拍| 欧美在线观看视频| 久久av一区| 精品二区久久| 亚洲久久视频| 国产精品久久久久久妇女6080| 欧美在现视频| 欧美一区国产在线| 在线欧美日韩精品| 亚洲美女精品久久| 亚洲福利视频一区二区| 欧美大片在线观看一区二区| 精品成人久久| 老司机午夜精品视频| 欧美精品网站| 午夜精品久久久久久久99黑人| 欧美一进一出视频| 亚洲第一精品影视| 日韩图片一区| 在线播放国产一区中文字幕剧情欧美| 91久久国产综合久久| 国产乱码精品一区二区三区五月婷| 亚洲最新中文字幕| 欧美黑人在线观看| 久久综合九色综合久99| 狠狠干综合网| 中文精品视频一区二区在线观看| 国产精品一区免费观看| 狂野欧美性猛交xxxx巴西| 欧美日韩精品一区二区天天拍小说| 一区二区三区视频在线观看| 亚洲激情在线播放| 国产精品永久免费| 你懂的国产精品| 国产麻豆午夜三级精品| 欧美高清视频在线观看| 欧美激情无毛| 国产一区视频网站| 亚洲精品国产拍免费91在线| 国外成人在线视频网站| 亚洲国产精品一区二区www| 欧美午夜激情在线| 欧美国产在线观看| 国产乱理伦片在线观看夜一区| 亚洲黄一区二区| 国产婷婷色一区二区三区在线| 美女啪啪无遮挡免费久久网站| 国产精品久久久久久久久久ktv| 亚洲欧美日本国产有色| 欧美久久九九| 狂野欧美一区| 国产精品亚洲综合| 亚洲一区二区三区777| 亚洲国产黄色| 久久久一本精品99久久精品66| 亚洲永久视频| 欧美大片免费| 亚洲黄一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 午夜激情综合网| 一区二区欧美国产| 亚洲国产日韩欧美在线99| 亚洲电影免费观看高清| 欧美在线播放| 久久婷婷国产综合尤物精品| 国产精品高潮呻吟视频| 久久爱www| 国产一区二区三区最好精华液| 艳妇臀荡乳欲伦亚洲一区| 亚洲午夜在线视频| 欧美黄色免费| 在线日韩一区二区| 蜜桃av综合| 老司机精品久久| 亚洲第一黄色| 久久久99精品免费观看不卡| 狠狠久久亚洲欧美专区| 久久先锋影音av| 另类专区欧美制服同性| 狠狠色丁香婷综合久久| 久久精品国产99国产精品| 久久免费黄色| **欧美日韩vr在线| 美女图片一区二区| 久久国产精品免费一区| 国产一区二区三区久久 | 日韩亚洲国产欧美| 久久免费偷拍视频| 欧美激情在线狂野欧美精品| 亚洲国产高清在线| 欧美日韩一二区| 亚洲午夜小视频| 免费亚洲一区二区| 亚洲日本电影在线| 久久精品午夜| 欧美激情欧美狂野欧美精品| 亚洲精品乱码| 欧美日韩综合久久| 亚洲视频你懂的| 亚洲精品黄网在线观看| 欧美日韩三区四区| 亚洲一品av免费观看| 久久久99免费视频| 夜夜精品视频一区二区| 欧美网站在线| 老司机精品久久| 亚洲免费成人av电影| 亚洲视频axxx| 亚洲激情电影中文字幕| 欧美视频专区一二在线观看| 久久久久天天天天| 亚洲精品少妇网址| 欧美va日韩va| 亚洲私人黄色宅男| 亚洲激情av| 国产毛片一区二区| 免费人成网站在线观看欧美高清| 亚洲午夜小视频| 韩国一区二区三区在线观看| 国产精品草莓在线免费观看| 午夜视频一区在线观看| 亚洲美女毛片| 麻豆国产精品777777在线| 亚洲毛片av| 国内在线观看一区二区三区| 欧美日本高清| 欧美另类变人与禽xxxxx| 欧美一区高清| 欧美永久精品| 中国成人在线视频| 99综合电影在线视频| 免费一级欧美片在线观看| 久久久国产精品一区| 一区二区高清| 国产精品视频免费| 国产精品一香蕉国产线看观看| 亚洲福利专区| 欧美大片一区二区| 性欧美超级视频| 久久av资源网| 香蕉尹人综合在线观看| 欧美在线视频免费| 亚洲一区二区三区在线视频| 亚洲午夜电影网| 日韩亚洲欧美高清| 日韩午夜精品| 亚洲人成在线播放| 欧美日韩国产在线| 欧美日韩免费观看一区二区三区 | 久久综合久久美利坚合众国| 中文网丁香综合网| 亚洲欧美成aⅴ人在线观看| 日韩系列在线| 午夜久久tv| 一区二区三区波多野结衣在线观看| 国产精品99久久不卡二区| 日韩午夜中文字幕| 亚洲欧美视频在线观看| 亚洲天堂成人在线观看| 亚洲欧美日韩综合国产aⅴ| 亚洲一区自拍| 亚洲韩国精品一区| 欧美日韩精品免费观看视一区二区 | 亚洲日本成人在线观看|