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

            亚洲午夜久久久影院伊人| 97久久国产综合精品女不卡| 久久国产精品一区二区| 国产精品一久久香蕉国产线看观看| 色综合久久中文字幕无码| 久久久精品人妻一区二区三区蜜桃 | 久久综合伊人77777麻豆| 一级女性全黄久久生活片免费| 久久久www免费人成精品| 久久99精品国产| 久久亚洲日韩看片无码| www.久久99| 成人综合久久精品色婷婷| 国产一久久香蕉国产线看观看| 欧美麻豆久久久久久中文| 久久久久亚洲AV片无码下载蜜桃| 日本精品久久久久中文字幕| 三级三级久久三级久久 | AV无码久久久久不卡蜜桃 | 国内精品综合久久久40p| 伊人热人久久中文字幕| 人妻精品久久无码专区精东影业| 国产毛片久久久久久国产毛片 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 亚洲欧美日韩久久精品第一区| 国产精品gz久久久| 精品亚洲综合久久中文字幕| 精品一二三区久久aaa片| 色婷婷噜噜久久国产精品12p| 一级做a爰片久久毛片16| 久久人人爽人人爽人人片av高请 | 99精品国产在热久久无毒不卡| 婷婷国产天堂久久综合五月| 久久精品成人欧美大片| 亚洲国产二区三区久久| 国产精品久久久久久久久鸭| 亚洲AV无码久久| 久久综合给合久久狠狠狠97色| 精品国产乱码久久久久久人妻| 一本久道久久综合狠狠爱| 久久天天躁狠狠躁夜夜avapp|