• <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++之竹

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

            常用鏈接

            統(tǒng)計(jì)

            最新評論

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

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

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

             

                 一開始,我先拿使用靜態(tài)成員變量的來實(shí)現(xiàn)的惰性單件來進(jìn)行嘗試,寫了個(gè)Demo,一運(yùn)行,O(∩_∩)O哈哈~,還真有意外的收獲呢!嗯~,抓緊時(shí)間,先把我的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}

            為了能夠分析得細(xì)致些,Demo寫得長了點(diǎn),見諒咯!~

                嗯,對了,還有運(yùn)行結(jié)果:

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

            從這個(gè)運(yùn)行結(jié)果,對通過靜態(tài)成員實(shí)現(xiàn)的惰性單件,我得到了以下兩點(diǎn):

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

            因此,我要奉勸各位開發(fā)者,如果在你的全局或靜態(tài)全局對象的構(gòu)造或析構(gòu)方法中調(diào)用某個(gè)單件,那么對該單件的實(shí)現(xiàn)就不要以靜態(tài)成員來惰性地實(shí)現(xiàn)。

             

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

            2021国内精品久久久久久影院| 少妇无套内谢久久久久| 久久久国产精华液| 欧美久久天天综合香蕉伊| 久久久久久午夜精品| 欧美精品久久久久久久自慰| 久久99中文字幕久久| 午夜精品久久久久久影视777| 色综合久久无码中文字幕| 日本免费久久久久久久网站| 2020久久精品亚洲热综合一本| 久久99精品国产麻豆宅宅| 久久久久噜噜噜亚洲熟女综合| 天堂久久天堂AV色综合| 久久本道久久综合伊人| 久久久久久九九99精品| 亚洲精品无码久久毛片| 亚洲国产精品婷婷久久| 中文精品久久久久人妻不卡| 久久精品成人免费观看97| 久久99国内精品自在现线| 亚洲精品无码久久毛片| 国产精品青草久久久久福利99| 欧美噜噜久久久XXX| 人妻无码精品久久亚瑟影视| 国产 亚洲 欧美 另类 久久| 久久久久久毛片免费播放| 97久久国产露脸精品国产| 午夜精品久久久久久久无码| 国产精品永久久久久久久久久| 久久青青草原精品国产| 久久99九九国产免费看小说| 久久精品国产黑森林| 99久久精品无码一区二区毛片 | 色婷婷噜噜久久国产精品12p| 99久久久精品免费观看国产| 久久偷看各类wc女厕嘘嘘| 久久精品人人做人人爽电影 | 久久精品国产久精国产果冻传媒| 久久精品无码一区二区app| 精品久久久无码中文字幕天天|