• <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>

            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 青碧竹 閱讀(290) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

            精品国产乱码久久久久久人妻| 69久久夜色精品国产69| 无码国内精品久久人妻麻豆按摩| 久久天天躁狠狠躁夜夜2020| 久久精品国产亚洲AV不卡| 久久综合噜噜激激的五月天| 精品久久久久久无码人妻热| 久久人做人爽一区二区三区 | 亚洲精品国产成人99久久| 久久久久国产精品三级网| 久久久久亚洲AV无码专区体验| 99久久精品这里只有精品| 无码人妻精品一区二区三区久久 | 狠狠色婷婷综合天天久久丁香 | 五月丁香综合激情六月久久| 亚洲国产成人久久精品动漫| 久久青青草视频| 久久精品国产99久久丝袜| 99久久久精品| 久久亚洲AV成人出白浆无码国产| 久久久久综合国产欧美一区二区| 国产精品99久久免费观看| 久久只这里是精品66| 久久精品成人一区二区三区| 99久久中文字幕| 欧美亚洲色综久久精品国产 | 久久久久亚洲精品天堂| 亚洲精品综合久久| 久久久久亚洲av毛片大| 亚洲成色999久久网站| AV狠狠色丁香婷婷综合久久| 色婷婷综合久久久久中文一区二区| 性高朝久久久久久久久久| 久久天天日天天操综合伊人av| 精品久久久久中文字| 97久久精品人人澡人人爽| 久久国产精品久久国产精品| 久久精品国产91久久麻豆自制| 久久久久AV综合网成人| 91精品国产91久久综合| 久久精品国产亚洲一区二区|