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

            最新評(píng)論

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

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

             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

            運(yùn)行后的結(jié)果:

             

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

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

             

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

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

             

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

            久久久精品一区二区三区| 久久婷婷五月综合国产尤物app| 国产99久久久国产精品~~牛| 久久精品国产亚洲5555| 99精品久久久久久久婷婷| 国产91色综合久久免费| 亚洲人成网亚洲欧洲无码久久| 久久99国产精品久久99| 伊人久久大香线蕉综合影院首页| 97久久超碰国产精品旧版| 久久精品一区二区三区中文字幕| 狠狠综合久久AV一区二区三区 | 国产精品亚洲综合久久| 秋霞久久国产精品电影院| 伊人久久大香线蕉精品不卡| 欧美久久久久久午夜精品| 亚洲精品无码成人片久久| 品成人欧美大片久久国产欧美...| 亚洲色欲久久久综合网东京热| 久久se精品一区二区影院 | 国产精品va久久久久久久| 亚洲午夜无码久久久久| 国内精品久久久久久久久| 99久久成人国产精品免费| 777午夜精品久久av蜜臀| 色偷偷88欧美精品久久久| 99久久99久久精品国产片| 9191精品国产免费久久| 久久久久高潮毛片免费全部播放 | 亚洲а∨天堂久久精品| 狠狠综合久久综合中文88| 香蕉久久夜色精品国产小说| 久久精品中文闷骚内射| 精品国产乱码久久久久久郑州公司| 久久夜色精品国产亚洲| 精品人妻久久久久久888| 久久综合九色综合网站| 欧美午夜精品久久久久免费视| 亚洲精品无码久久久久久| 嫩草伊人久久精品少妇AV| 久久香综合精品久久伊人|