• <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++應用(四)

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

             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

            運行后的結果:

             

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

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

             

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

            嗯~,突然發現,我漏寫了對這全部四篇內容的一個總結,……還是算了,就請各位原諒我這次的偷懶咯!~

             

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

            久久成人精品| 99re久久精品国产首页2020| 久久se精品一区二区影院| 久久一区二区三区免费| 久久久久久久精品成人热色戒| 久久精品无码一区二区无码| 四虎国产精品免费久久5151| 香蕉99久久国产综合精品宅男自 | 久久综合伊人77777麻豆| 97久久国产露脸精品国产| 91精品婷婷国产综合久久| 欧美亚洲国产精品久久高清| 亚洲天堂久久精品| 亚洲成色www久久网站夜月| 国产99久久久国产精品~~牛| 超级97碰碰碰碰久久久久最新| 免费精品久久久久久中文字幕| 久久噜噜电影你懂的| 中文精品99久久国产| 99精品久久精品| 日韩精品久久久肉伦网站| 久久综合给合综合久久| 久久777国产线看观看精品| 久久久久亚洲精品日久生情| 少妇久久久久久被弄到高潮| 久久综合狠狠综合久久激情 | 久久精品亚洲中文字幕无码麻豆| 日韩影院久久| 久久www免费人成精品香蕉| 国产精品久久久久一区二区三区| 国产精品视频久久| 国产精品久久久久jk制服| 亚洲色欲久久久综合网| 亚洲国产精品高清久久久| 久久久久国产精品人妻| 囯产极品美女高潮无套久久久| 少妇人妻综合久久中文字幕| 一级A毛片免费观看久久精品| 青青青青久久精品国产h久久精品五福影院1421| 久久精品国产91久久综合麻豆自制| 精品一区二区久久久久久久网站|