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

            flyman

            opengl world
            隨筆 - 10, 文章 - 0, 評論 - 65, 引用 - 0
            數(shù)據(jù)加載中……

            指針和引用的區(qū)別

            單件模式,像所有的同志一樣我也在用,不過不幸的是我走上了

            歧途。鑒于對社會強烈地責任感(吐),我認為有必要做個簡要

            的總結(jié)來避免后人步我的后塵(狂吐)。

            那么現(xiàn)在開始寫正式的悔過書。
            首先,首先清一下嗓子,哈哈。
            再次,醞釀一下感情。
            最后,再清一下嗓子,OK,THATS ALL,^_^.

            所有有正義感的人都在向我扔鼠標,有的人開始搬起顯示器。好

            ,好,在這種躁動下,不利于我誠心接受犯下的滔天錯誤,請大

            家少安毋躁,請看下下面的代碼:

            template <typename T> class  Singleton
            {
            protected:

                T* ms_Singleton;//此行黏貼錯誤,前面應(yīng)該加 STATIC

            public:
                Singleton( void )
                {
                    assert( !ms_Singleton );
                    ms_Singleton = static_cast<T*>(this);
                }
               ~Singleton( void )
                    {  assert( ms_Singleton );  ms_Singleton = 0;  }
                static T& getSingleton( void )
                    {  assert( ms_Singleton );  return (

            *ms_Singleton );  }
                static T* getSingletonPtr( void )
                    {  return ( ms_Singleton );  }
            };
            非常明顯,這段代碼是無懈可擊的,嘿嘿。出品人(    Paul D

            Turner)。
            那么看看我糟糕的表現(xiàn):
            class Application: public Singleton<Application>
            {
                public:
                static Application* getSingletonPtr();
                static Application getSingletonP();
            void Run();
               
            }
            明眼人一眼就看出了端倪,我犯了個超級錯誤,那就是
            Application getSingletonPtr();
            這是致命的缺陷,直接導致了單件模式的失敗,這樣的寫法首先

            語法上是說的過去的,但事實上我并沒有重載
            Application& getSingleton();所以當我在別的類中用
            Application::getSingleton()時出現(xiàn)了讓我眼前發(fā)黑的一暮。

            因為當程序剛剛跳出調(diào)用這個方法的方法時(like that:
            void ClassRoot::RunApplication
            {
                Application::getSingleton().Run();
            }

            ,Application的析構(gòu)函數(shù)被調(diào)用,結(jié)果可想而知,Application

            中的所有的資源都被釋放。接著系統(tǒng)無情的扔出一個面目可憎的

            窗體,對我進行了最為嚴厲的批評,這個批評直接導致了你在此

            消磨時間。特別聲名,由此對你青春的耽擱,從刑法上講,我不

            會負主要責任,^_^.
            “這是為什么”,我問了同樣的問題而且不只“千百遍”。我只

            是沒有用引用而已,是的,引用,這的確是個問題。就象用指針

            一樣,引用也是沒有問題地。前面程序失敗的原因是有新的臨時

            Application實例產(chǎn)生,當運行完RunApplication時,臨時對象

            被釋放,他調(diào)用了析構(gòu)函數(shù),不幸的是,我在他里面釋放了一些

            指針和資源,錯誤產(chǎn)生了,他是如此的自然和順理成章。
            引用,指針,我想有必要看看他們的貓膩所在。

            LOOK一下下面的代碼:
            #include "stdafx.h"
            #include <string>
            #include <iostream>
            using namespace std;

            class ouyang2008
            {

            public:
                int a;
                int b;
                ouyang2008(){a=0;b=0;}
                ~ouyang2008(){}
                void printtext()
                {
                    //cout<<a<<endl<<b<<endl;
                }
            };

            int _tmain(int argc, _TCHAR* argv[])
            {

                ouyang2008* pObj=new ouyang2008;
                //cout<<pObj<<endl;
                ouyang2008& obj=*pObj;
                ouyang2008* p=&obj;
                delete pObj;
                cout<<p;
                    return 0;
            }

            現(xiàn)在我們注意的焦點在:
                ouyang2008& obj=*pObj;
                ouyang2008* p=&obj;
            看看他們有什么不同,那么我們怎么LOOK呢?WIN32 ASM,

            yes,it is that:
                ouyang2008& obj=*pObj;
            00411556  mov         eax,dword ptr [ebp-14h]
            00411559  mov         dword ptr [ebp-20h],eax
                ouyang2008* p=&obj;
            0041155C  mov         eax,dword ptr [ebp-20h]
            0041155F  mov         dword ptr [ebp-2Ch],eax
            哦,ALL is here ,so it is org.
            從匯編上來看,他們沒有任何區(qū)別,他們都在函數(shù)的堆棧中保存

            了一個對象的指針,所以當退出函數(shù)時只是釋放了指針而已,對

            對象沒有任何影響。
            現(xiàn)在我們可以講:
            對機器來說他們沒有任何區(qū)別。
            對使用者來講,咳、咳、咳,我不得不很無奈的重復別人所說的
            “引用是安全的”。

            為什么是安全的?
            第一,你不用擔心釋放的問題。
            第二呢,你不會很驚訝地看著讓你膽戰(zhàn)心驚的“EXCEPTION

            ASSETT ERROR ox0000005 access invalidate”.
            運行以下下面的代碼:
            #include "stdafx.h"
            #include <string>
            #include <iostream>
            using namespace std;

            class ouyang2008
            {

            public:
                int* a;
                int* b;
                ouyang2008(){a=new int[1];b= new int[1];}
                ~ouyang2008(){delete[] a;delete[] b;a=b=NULL;}
                void printtext()
                {
                    cout<<*a<<endl<<*b<<endl;
                }
            };

            int _tmain(int argc, _TCHAR* argv[])
            {

                ouyang2008* pObj=new ouyang2008;
                //cout<<pObj<<endl;
                ouyang2008& obj=*pObj;
                ouyang2008* p=&obj;
                delete pObj;
                if (p)//禍根
                {
                    p->printtext();
                }
                cout<<p;
                    return 0;
            }
            當然如果你現(xiàn)在的工作是對付。NET
            你沒有必要注意這方面的問題:
            曾經(jīng)有為老兄在。NET還到處是臭蟲的時候就這樣說過:
            “對于。NET來講,任何類的對象都是在堆中建立的,類的變量

            和對象之間只有引用,如果你在棧中看到了類的對象,那你就是

            見到鬼了,而且是。NET鬼。”
            呵呵,THAT IS OVER。
            雙手合十,企求我不是在胡說八道。

            posted on 2007-06-28 18:52 flyman 閱讀(1613) 評論(6)  編輯 收藏 引用

            評論

            # re: 指針和引用的區(qū)別  回復  更多評論   

            恕我愚昧,我怎么也沒看出這是Singleton
            你這個Singleton首先不是唯一的,
            我到哪里用都是新的對象?
            那還叫什么單件?
            而且也沒有看出哪里實例出對象啊,
            希望解釋一下

            唉~~~~~
            2007-06-29 10:16 | nick

            # re: 指針和引用的區(qū)別  回復  更多評論   

            寫文章的“廢話”似乎太多了,又不用騙稿費。
            呵呵,也許是個人風格吧~~不過看了開頭幾句"廢話",就不想再看了~
            2007-06-29 13:52 | SuperPlayeR

            # re: 指針和引用的區(qū)別[未登錄]  回復  更多評論   

            static T& getSingleton( void )
            { assert( ms_Singleton ); return (

            *ms_Singleton ); }
            static T* getSingletonPtr( void )
            { return ( ms_Singleton ); }


            static menber function 可以直接訪問非static member var??
            2007-06-29 15:36 | 1111111

            # re: 指針和引用的區(qū)別  回復  更多評論   

            nick 說的極是,TAG中加入單件有誤導,所以我已經(jīng)刪除,但為了保證NICK批評的正確性,我不準備再做修飾^_^。

            1111111,非常佩服你的眼力,我黏貼那段代碼的時候沒有看,代碼中確實有STATIC,而且應(yīng)該有。可以參考CEGUI。

            3KS.
            2007-06-29 18:22 | flyman

            # re: 指針和引用的區(qū)別  回復  更多評論   

            關(guān)于Singleton,你看看這篇文章http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf,你會絕望的。
            2007-06-30 13:50 | ChenA

            # re: 指針和引用的區(qū)別  回復  更多評論   

            不至于那么脆弱,o(∩_∩)o
            多謝提供好文,學習學習。



            2007-06-30 19:17 | ouyang2008
            18岁日韩内射颜射午夜久久成人| 国产成人久久AV免费| 精品无码人妻久久久久久| 久久婷婷综合中文字幕| 色婷婷久久综合中文久久一本| 久久夜色撩人精品国产| 久久中文骚妇内射| 国产99久久久久久免费看| 伊色综合久久之综合久久| 高清免费久久午夜精品| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 国产一区二区三区久久精品| 久久久久久综合一区中文字幕| 久久综合成人网| 久久久精品国产sm调教网站 | 亚洲欧美国产精品专区久久| 久久精品天天中文字幕人妻| 久久强奷乱码老熟女| 国产精品福利一区二区久久| 久久亚洲AV成人无码| 99热成人精品免费久久| 久久这里只有精品18| 久久笫一福利免费导航 | 色综合久久88色综合天天 | 欧美精品一区二区精品久久| 人人狠狠综合久久88成人| 亚洲&#228;v永久无码精品天堂久久 | 亚洲精品NV久久久久久久久久| 97久久综合精品久久久综合| 亚洲精品乱码久久久久久久久久久久| 一级做a爰片久久毛片16| 久久99精品国产| 97热久久免费频精品99| 久久精品国产亚洲AV高清热| 亚洲AV无码1区2区久久| 伊人久久无码中文字幕| 久久精品成人欧美大片| 久久99久国产麻精品66| 久久久久国产精品嫩草影院| 少妇熟女久久综合网色欲| 亚洲欧美一区二区三区久久|