• <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 青碧竹 閱讀(354) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

            99久久精品国产一区二区三区 | 久久精品国产福利国产琪琪| 日本免费一区二区久久人人澡| 久久九九有精品国产23百花影院| 久久99精品免费一区二区| 久久精品三级视频| 久久99精品国产麻豆宅宅| 亚洲国产精品久久久久久| 久久久久亚洲国产| 久久久91精品国产一区二区三区| 久久久久国产一级毛片高清板| 国内精品久久国产| 国内精品伊人久久久久影院对白| 亚洲AV无码久久| 久久中文字幕无码专区| 国产午夜福利精品久久2021| 人人狠狠综合久久亚洲| 青青草原综合久久大伊人精品| 模特私拍国产精品久久| 亚洲国产成人久久综合一| 久久精品亚洲精品国产色婷 | 伊人久久精品影院| 国产女人aaa级久久久级| 久久久久久夜精品精品免费啦| 香港aa三级久久三级老师2021国产三级精品三级在 | 精品久久久久国产免费| 国产精品一区二区久久不卡| 中文精品久久久久人妻不卡| 国产精品久久久久久五月尺| 久久精品国产亚洲精品| 国产精品成人久久久久三级午夜电影| 久久精品一本到99热免费| 久久精品国产精品亚洲精品| 无码人妻久久一区二区三区蜜桃| 伊人色综合久久| 国产69精品久久久久9999| 欧美日韩成人精品久久久免费看| 久久久久亚洲AV综合波多野结衣| 欧美日韩成人精品久久久免费看| 欧美精品丝袜久久久中文字幕 | 亚洲中文精品久久久久久不卡|