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

            最新評論

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

             在前面的例子中,我們看到:采用 new 來為單件對象分配空間,如果采用手動調(diào)用 delete 或封裝了 delete 的 Release 操作,一旦遇到全局對象的析構(gòu)有調(diào)用單件對象,就會使得無法在代碼中找到適合釋放單件對象的時機。那么,是否可以讓系統(tǒng)來自動選擇時機,調(diào)用釋放呢?如果可以,又該怎么在代碼中構(gòu)建單件對象的自動釋放機制呢? 對這兩個問題,在進(jìn)行了一番思考和嘗試后,終于找到了答案 —— 內(nèi)建只有一個析構(gòu)方法的結(jié)構(gòu)體,定義一個靜態(tài)的該結(jié)構(gòu)體的變量,并在結(jié)構(gòu)體的析構(gòu)中釋放單件對象。下文將就此給出 Demo,還望有高手能給出更好的方案。(從前面內(nèi)容,我們已經(jīng)知道,單件對象的指針通過靜態(tài)類成員變量進(jìn)行存儲,并通過 new 分配的方式,存在在著線程安全的問題。同理,下面Demo的單件類A在多線程環(huán)境使用時,自然也存在線程安全的問題。)

             Demo代碼如下:

              1// Singleton demo_2: Singleton instance is created by new.
              2// [A does not support multithreading, but C support.] + [delete instance automatically]
              3
              4#include <Windows.h>
              5#include <iostream>
              6
              7class A 
              8{
              9private:
             10    static struct A_RELEASER {
             11        ~A_RELEASER() {
             12            std::cout << "Release singleton of A. {{" << std::endl;
             13            if (ms_pInstance != NULL)
             14            {
             15                delete ms_pInstance;
             16                ms_pInstance = NULL;
             17            }

             18            std::cout << "}} Release singleton of A." << std::endl;
             19        }

             20    }
             ms_autoReleaser;
             21
             22    static A* ms_pInstance;
             23
             24public:
             25    static A& GetInstance();
             26
             27private:
             28    A() : m_nStat1(-1), m_nStat2(-1{
             29        m_nStat1 = 0;
             30        std::cout << "Construct A" << std::endl;
             31        m_nStat2 = 0;
             32    }

             33    A(const A&);
             34
             35public:
             36    ~A() {
             37        m_nStat1 = 0;
             38        std::cout << "Destruct A" << std::endl;
             39        m_nStat2 = 0;
             40    }

             41
             42    void Do() {
             43        ++m_nStat1;
             44        ++m_nStat2;
             45        std::cout << "Called Do() by object of A. [" 
             46            << m_nStat1 << "" 
             47            << m_nStat2 << "]" 
             48            << std::endl;
             49    }

             50
             51private:
             52    int m_nStat1;
             53    int m_nStat2;
             54}
            ;
             55
             56class C
             57{
             58private:
             59    static struct C_RELEASER {
             60        ~C_RELEASER() {
             61            std::cout << "Release singleton of C. {{" << std::endl;
             62            delete &GetInstance();
             63            std::cout << "}} Release singleton of C." << std::endl;
             64        }

             65    }
            ;
             66
             67public:
             68    static C& GetInstance();
             69
             70private:
             71    C() : m_nStat(-1{
             72        std::cout << "Construct C" << std::endl;
             73        m_nStat = 0;
             74    }

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

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

             89
             90private:
             91    int m_nStat;
             92}
            ;
             93
             94class B
             95{
             96public:
             97    B(int nID) : m_nID(nID) {
             98        std::cout << "Construct B: " << m_nID << std::endl;
             99        A::GetInstance().Do();
            100        C::GetInstance().Do();
            101    }

            102    ~B() {
            103        std::cout << "Destruct B: " << m_nID << std::endl;
            104        A::GetInstance().Do();
            105        C::GetInstance().Do();
            106    }

            107
            108private:
            109    int m_nID;
            110}
            ;
            111
            112static B gs_B0(0);
            113B g_B1(1);
            114
            115A* A::ms_pInstance = NULL;
            116A::A_RELEASER A::ms_autoReleaser;
            117A& A::GetInstance()
            118{
            119    if (NULL == ms_pInstance)
            120    {
            121        ms_pInstance = new A;
            122    }

            123
            124    return *ms_pInstance;
            125}

            126
            127C& C::GetInstance()
            128{
            129    static C_RELEASER s_autoReleaser;
            130    static C* s_pInstance = new C;
            131
            132    return *s_pInstance;
            133}

            134
            135static B gs_B2(2);
            136B g_B3(3);
            137
            138int main(int argc, char * argv[])
            139{
            140    std::cout << "Enter main" << std::endl;
            141    A::GetInstance().Do();
            142    C::GetInstance().Do();
            143    
            144    system("pause");
            145    return 0;
            146}

            147

            運行后的結(jié)果:

             

            綜合Demo代碼和運行結(jié)果,我們可以看到,對于單件類A的對象釋放者采用了類的靜態(tài)成員的方式來定義,其結(jié)果是,單件類A的對象釋放時機仍然不對。

            再看C,代碼中new 所得的對象指針交由一局部靜態(tài)變量以保證 new 只會執(zhí)行一次(從而保證了線程安全), 而單件對象的釋放者就定義在緊挨 new 的前面(事實上,也可以定義在緊挨 new 的后面)。接著是執(zhí)行結(jié)果,完全OK! 哈哈~,值得推薦的第二種C++單件類構(gòu)建模式終于也出爐了,那就是上例Demo中,單件類C的構(gòu)建模式。

             

            至此,《Singleton模式——C++應(yīng)用》全部完成,因為還是第一次寫技術(shù)博客,寫得不好,還請各位看官見諒!

            嗯~,突然發(fā)現(xiàn),我漏寫了對這全部四篇內(nèi)容的一個總結(jié),……還是算了,就請各位原諒我這次的偷懶咯!~

             

            posted on 2012-03-14 01:07 青碧竹 閱讀(348) 評論(0)  編輯 收藏 引用 所屬分類: 設(shè)計模式

            色综合久久中文字幕无码| 99久久婷婷国产一区二区 | 品成人欧美大片久久国产欧美...| 麻豆国内精品久久久久久| 国产精品欧美亚洲韩国日本久久| 久久久久久亚洲精品成人 | 婷婷综合久久中文字幕蜜桃三电影| 久久亚洲精品无码播放| 国产精久久一区二区三区| 精品视频久久久久| 色欲综合久久躁天天躁| 久久久久99精品成人片三人毛片| 久久久久久国产精品免费免费 | 久久久久亚洲AV片无码下载蜜桃 | 激情五月综合综合久久69| 久久青青草原精品影院| 99久久伊人精品综合观看| 国产精品热久久无码av| 日韩中文久久| AV无码久久久久不卡蜜桃| 国产精品一久久香蕉国产线看观看| 久久婷婷久久一区二区三区| 久久久久久一区国产精品| 久久久亚洲裙底偷窥综合| 人妻无码中文久久久久专区| 曰曰摸天天摸人人看久久久| 无码任你躁久久久久久| 久久久久久久久久久久中文字幕 | 久久精品国产亚洲av麻豆色欲| 国产精品久久一区二区三区| 国内精品久久久久国产盗摄| 99精品国产99久久久久久97| 亚洲一区二区三区日本久久九| 狠狠色丁香久久婷婷综合_中 | 99久久亚洲综合精品成人| 久久狠狠爱亚洲综合影院| 国产成人无码久久久精品一| 久久综合久久鬼色| 精品国产一区二区三区久久| 欧美成人免费观看久久| 久久国产成人精品国产成人亚洲|