• <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è)計模式

            77777亚洲午夜久久多人| 亚洲国产精品无码成人片久久| 蜜臀久久99精品久久久久久小说| 香蕉久久夜色精品国产2020| 99久久夜色精品国产网站| 99久久国产热无码精品免费| 久久精品国产精品亚洲下载| 亚洲欧洲日产国码无码久久99| 久久亚洲欧美国产精品| 久久狠狠色狠狠色综合| 亚洲精品综合久久| 国内精品久久久久久久97牛牛| 国产高清美女一级a毛片久久w| 久久伊人五月丁香狠狠色| 午夜不卡888久久| 久久久久亚洲AV无码观看 | 无码久久精品国产亚洲Av影片| 国产精品无码久久久久久| 日日狠狠久久偷偷色综合免费| 久久精品国产久精国产思思| 一本色综合久久| 久久精品国产99国产精品| 国产精品99久久99久久久| 国产69精品久久久久观看软件 | 久久亚洲国产精品成人AV秋霞 | 精品久久久久久无码中文字幕| 精品久久久中文字幕人妻| 久久人妻少妇嫩草AV无码蜜桃| 成人久久久观看免费毛片 | 91精品观看91久久久久久| 人妻久久久一区二区三区| 色狠狠久久综合网| 久久婷婷色香五月综合激情 | 99久久精品免费| 久久天天躁狠狠躁夜夜躁2O2O| 久久久久久久久久久精品尤物 | 久久影视综合亚洲| 久久久久婷婷| 亚洲国产香蕉人人爽成AV片久久| 手机看片久久高清国产日韩| 无码8090精品久久一区|