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

            一個要引起注意的delete動作

            我在雙向鏈表類中定義的clear()函數(shù)
            如下:

            void clear()

                   {

                          if( !isEmpty() )

                          {

                                 list_item< type >* temp = list_head;

                                 list_item< type >* delTemp;

                         

                                 while( temp !=  list_tail )

                                 {

                                        delTemp = temp;

                                        temp = temp->back;

                                        delete delTemp;//釋放空間

                                 }

            原來這里的語句是temp !=  list_tail->back 但是一旦 temp 被賦值為 list_tail->back //么它本身就是 delTemp 即將被刪除的空間的一部分 再對一個已經(jīng)不存在的指針進(jìn)行操作當(dāng)然就會崩潰 這樣就導(dǎo)致在對temp的引用是不存在的 所以出錯

                                 delete list_tail;

                                 list_head = NULL;

                                 size = 0;

                          }

                          else

                          {

                                 return;

                          }

                   }

            我還是很快發(fā)現(xiàn)了 但是很有覺得價值 所以寫下提醒自己

            posted on 2007-04-11 16:55 lele 閱讀(1468) 評論(15)  編輯 收藏 引用

            評論

            # re: 一個要引起注意的delete動作 2007-04-13 12:40 anthony

            不知道你之前的代碼是不是只是while那里不一樣,
            個人感覺不是temp的問題,如果照你以前的寫法,應(yīng)該是是最后的delete list_tail;的問題
            void clear()

            {

            if( !isEmpty() )

            {

            list_item< type >* temp = list_head;

            list_item< type >* delTemp;



            while( temp != list_tail->back)//你以前的寫法

            {

            delTemp = temp;

            temp = temp->back;


            delete delTemp;//釋放空間

            }



            // delete list_tail; //這句不要了,因?yàn)閐elTemp 總是指向temp的前一個,當(dāng)temp = list_tail->back時是在最后,此時delTemp = list_tail已刪除完整個鏈表,覺得如果你之前的語句只是while那里不一樣,應(yīng)該是這里出錯了,不知道有沒有理解你原來的意思。覺得有點(diǎn)疑問

            list_head = NULL;

            size = 0;

            }

            else

            {

            return;

            }

            }

              回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 00:09 lele

            呵呵 謝謝你的疑問 我剛剛走查了一下就是我的那個問題
            你可以自己試一試 當(dāng)執(zhí)行到delTemp指向尾節(jié)點(diǎn)的前一個節(jié)點(diǎn)時 temp指向尾節(jié)點(diǎn) 此時還不滿足temp != list_tail->back 但是下一句是
            delTemp = temp; 這句之后 temp = temp->back; 這句之后 temp滿足了退出循環(huán)的條件 但是它指向了尾節(jié)點(diǎn)的一部分(list_tail->back )而這個list_tail->back 經(jīng)過隨后的一步delete delTemp;就被刪除了 這樣在下一次循環(huán)入口條件判斷時 temp已經(jīng)成了一個野指針 對它的引用當(dāng)然也是不正確的

            不知道這樣說你清楚了嗎??  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 10:53 anthony

            你的意思是temp=list_tail->back ;時,deltemp等于list_tail,然后刪除了deltemp,相當(dāng)于刪了list_tail,這樣我覺得應(yīng)該是list_tail變成了野指針吧(其實(shí)都一樣),我的想法是這樣的,如果list_tail->back = NULL ,temp就變成了NULL,而應(yīng)該是list_tail變成了野指針,我知道這是有點(diǎn)鉆死胡同的感覺(因?yàn)榻Y(jié)果是一樣的),我只是把為什么我不理解你的程序的那些注釋說出來而已,討論清楚而已,你覺得是不是應(yīng)該是list_tail是野指針,而不是temp?

            不過說真的我光注意前面的temp了,而沒注意后面的tail_back(就while的條件里面),看來以后還得注意前后  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 13:31 lele

            list_tail是類的成員 這個類都被釋放了就不存在了 那么你說list_tail是什么?? 而temp是無關(guān)的局部變量 它在這個局部內(nèi)使我控制 除了這個局部就不是我能管理的了 但是類不同 temp要使用我類中的back成員 當(dāng)然得back存在啊 而我把back delete了 你說temp指向的list_tail的back是什么??  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 13:32 lele

            不過以后大家可以經(jīng)常討論 這是好事情 我要謝謝你的  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 14:29 anthony

            你的clear函數(shù)只是清空了鏈表的內(nèi)存空間listitem,并沒有刪除list這個對象,對象的刪除得由析構(gòu)函數(shù)來執(zhí)行
             

            比如你執(zhí)行了一個LIST Object,只是一個鏈表對象,往里面加item,然后clear方法Object.Clear()只是刪除了里面的item的空間,而成員對象是否應(yīng)該還存在?就是List_tail還是一個指針,它還有它的值,它指向它原先的內(nèi)存地址,我的理解是比如List_tail現(xiàn)在是一個門牌號101,而item是里面的人,里面如果搬家了,執(zhí)行的是Clear,但門牌號還在,而只有把房子給拆了,才是把對象給釋放了,或者你可以試一下把List_tail設(shè)為公有,然后Clear()后,然后List_tail 0x16;這說明List_tail還是存在,它還指向那片內(nèi)存單元,或者你跟蹤一下,在執(zhí)行Clear之前,看下list_tail的地址,Clear之后,在看下那地址,是不是一樣的,temp也只是個指針,無論后面的list_tailback存不存在,它還是個內(nèi)存中的一個編號(門牌號),如果存在,程序正確,不存在,就是野指針,個人認(rèn)為只要它值為NULL它就不應(yīng)該是野指針,我說的應(yīng)該是list_tail是野指針,是因?yàn)楫?dāng)最后deltemp也指向list_tail時,temp = list_tail->back = NULL;此時由于delete deltemp

            list_tail空間就不存在了,但它還指向那個地址,但是后面就沒有back了,所以會出錯


            如果改成
             

            while(temp != list_tail->back && temp != NULL), 當(dāng)然這個沒你的算法好,這個得多做多個判斷,時間負(fù)責(zé)度比你原先的高,就是感覺要說引用了不存在的對象應(yīng)該是list_tail引用了不存在的對象,你覺得呢?(個人愚見)

              回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-14 23:11 lele

            temp != list_tail->back && temp != NULL這里依然有個問題就是
            先判斷temp != list_tail->back會出錯,還是把兩個語句調(diào)換一下位置
            這樣就能保證安全性了 呵呵
            你的想法挺好的 謝謝你的想法!  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-16 09:41 anthony

            以前倒還真沒注意過和順序有關(guān),又學(xué)到了,看來討論真的能有意外的收獲,謝謝你的指正

            呵呵,聽你這么一說,然后覺得是不是while(temp != NULL)就可以了?  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-17 18:09 lele

            呵呵 我都被你誤導(dǎo)了 temp != list_tail->back 和 temp != NULL 這兩局并沒有區(qū)別 list_tail->back 就是NULL
            List_tail指向的內(nèi)容被析構(gòu)之后 系統(tǒng)就會給List_tail分配一個我們無法得知的指向。
            back不在了之后 我下一步要執(zhí)行的是判斷temp是不是back 你說它都沒有了怎么判斷呢?
            你的編程想法真的很有意思。你怎么知道temp一定是NULL 那是你的機(jī)器 我的機(jī)器就不是 而且怎么可能呢? 我是在堆棧上面申請的。temp是靜態(tài)的。它指向的內(nèi)存被系統(tǒng)回收了,你怎么還可以用呢? 無論是不是NULL 只要你動用就是出錯。這樣編程不好 代碼可以說很差 太不安全 太隨意 還要依靠運(yùn)氣 你說呢?
              回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-04-17 21:45 anthony

            對啊,所以你不是說要給它換個順序變成
            while(temp != NULL && temp != list_tail->back )嗎?這樣不就安全了嗎?

            如果你是這個意思,下面的就別看了,這樣不就安全了嗎?還能有什么問題嗎?

            可能我理解NULL有問題,我覺得NULL就相當(dāng)于一個const變量,它永遠(yuǎn)指向內(nèi)存中的一個不存在的地方,“ list_tail->back 就是NULL ”沒錯,然后當(dāng)temp指向list_tail時,然后根據(jù)while(temp!=NULL)進(jìn)入循環(huán)體,接著deltemp就指向了list_tail,然后temp = temp_back,就是此時,
            temp=NULL,然后刪除了list_tail,然后判斷時,temp不是等于NULL了嗎?然后循環(huán)條件成立不了,

            我的理解是NULL是指向一個相當(dāng)于CONST的地址空間,不管list_tail有沒有,我們都可以指向NULL,NULL和list_tail 沒關(guān)吧?

            還有說的“List_tail指向的內(nèi)容被析構(gòu)之后 系統(tǒng)就會給List_tail分配一個我們無法得知的指向”,我覺得它還是指向原來那個地方吧?

            我觀察了下面的代碼

            int *p = NULL;//此時p指向0x00000000
            p = new int [200];//此時p指向0x00441ac0
            delete p;
            cin>>a;//此時p還指向0x00441ac0


            然后還有
            temp != list_tail->back 和 temp != NULL

            對于前面的節(jié)點(diǎn)時它們是一樣的,但在最后那個點(diǎn)時,即deltemp = list_tail時,然后temp = temp->back(就是NULL)了,然后系統(tǒng)把list_tail刪了,然后list_tail還指向那個系統(tǒng)單元(就是只是系統(tǒng)把房子里的人趕了出去,但門牌號還是那個),然后再進(jìn)入循環(huán)條件,然后此時list_tail->back 引用就會出錯了,因?yàn)閘ist_tail里面已經(jīng)沒“人”了,在加一個back相當(dāng)里面的一個人,所以會出錯,

            不知道你能否明白我的意思,或者可能我沒明白你的意思,還有一個就是NULL的問題,就是temp的指向的內(nèi)容被回收,但它還是可以指向地址,現(xiàn)在就是指向NULL,只要temp!=NULL,只是判斷temp的數(shù)值而已,呵呵,寫著寫著就變很羅嗦了,呵呵   回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-05-09 00:41 lele

            呵呵 這段時間有事離開了
            我的意思就是感覺編程不能碰運(yùn)氣,還是以安全為上是好習(xí)慣
            走查會根據(jù)編譯器不同而分配給你用的內(nèi)存的初始內(nèi)容不同。誰也不能控制。  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-05-12 10:14 anthony

            呵呵,同意編程不能靠運(yùn)氣。
             
            可能我水平太低吧,不能理解指針的真正含義?也不能理解你的意思。
             
            我實(shí)在不明白list_tail->back=null,然后temp=list_tail->back,然后temp不是指向了null嗎?對于一個指針我覺得可以對它進(jìn)行任何賦值,然后temp!=null只是拿存放指針本身的那塊內(nèi)存里面的數(shù)值去和0X0000000內(nèi)存地址比較,即使指向的內(nèi)容被析構(gòu)了,但指針?biāo)瑯诱贾膬?nèi)存空間,拿temp和null比只是存放temp指針那塊內(nèi)存里面的數(shù)值和null比,不是存放temp指針的那塊內(nèi)存里面的數(shù)值指向的內(nèi)存,怎么會出錯呢?
             
            不過你的代碼看起來真的很舒服,不知道你是怎么做到的,就是我寫的時候縮排格式,我也一直在注意,按照《高質(zhì)量程序設(shè)計指南 C++/C語言》 上面的寫法來寫的,但還是感覺有點(diǎn)亂,是不是注釋寫得太多會顯得亂呢?這方面得向你請教,呵呵
              回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-06-07 14:25 lele

            問題不是出在temp是出在list_tail->back
            list_tail對back的操作
            back已經(jīng)被釋放了,不可再訪問

            呵呵 我水平很一般,前幾天ACM亞洲銀獎的同學(xué)敲代碼,半小時做三道題,我都崩潰了……
            慢慢來吧,總是天外有天的。  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-07-26 11:35 anthony

            list_tail->back不就是null嗎?它沒有指向哪個對象,只是指向null那個地址0x00000000,而已,null就是0x00000000,沒有指向哪個對象,呵呵,

            好長時間沒過來了,不知道你是否也還記得你所寫的,和我們討論的,我剛是從頭到尾又看了編。

            acm亞洲銀獎?那很厲害的,同時呢我也參加過acm,也見過好多acm的同學(xué)的代碼,還有網(wǎng)上的一些比較厲害的人的代碼,因?yàn)樗麄冏非蟮氖撬俣龋还苁撬惴ㄐ剩€是敲程序的速度,所以我看過的acm代碼的風(fēng)格沒有你寫得好,我還記得我那時候見他們敲字得速度,驚訝得說不出話來了,呵呵  回復(fù)  更多評論   

            # re: 一個要引起注意的delete動作 2007-07-26 11:53 anthony



            哈哈,抱歉,終于知道我哪里出問題了,你看下是不是這里:

            # re: 一個要引起注意的delete動作 2007-04-17 18:09 lele
            呵呵 我都被你誤導(dǎo)了 temp != list_tail->back 和 temp != NULL
            這兩局并沒有區(qū)別 list_tail->back 就是NULL


            在list_tail沒被刪除前,這兩句的確是一樣的,可list_tail->back被刪后,這就不一樣了,因?yàn)閠emp沒有引用->back,而list_tail引用了back,而list_tail被刪除了,所以不能引用list_tail->back,而就像你前面告訴我的

            # re: 一個要引起注意的delete動作 2007-04-14 23:11 lele
            temp != list_tail->back && temp != NULL這里依然有個問題就是
            先判斷temp != list_tail->back會出錯,還是把兩個語句調(diào)換一下位置
            這樣就能保證安全性了 呵呵




            還是你提醒了我

            # re: 一個要引起注意的delete動作 2007-06-07 14:25 lele
            問題不是出在temp是出在list_tail->back
            list_tail對back的操作
            back已經(jīng)被釋放了,不可再訪問


            你是不是敲錯了,是list_tail被釋放了??呵呵



            謝謝你的指點(diǎn)啊,經(jīng)過這樣討論,我覺得應(yīng)該對指針和鏈表的認(rèn)識又進(jìn)一步了,謝謝你啊,呵呵  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久午夜夜伦鲁鲁| 亚洲国产一成久久精品国产成人综合| 久久综合成人网| 99久久国产免费福利| 色综合久久久久综合体桃花网| 久久频这里精品99香蕉久| 色99久久久久高潮综合影院| 欧美日韩成人精品久久久免费看| 久久国产福利免费| 久久久久国产| 免费一级做a爰片久久毛片潮| 久久久久久青草大香综合精品| 欧美一级久久久久久久大| 久久综合成人网| 精品久久久中文字幕人妻| 蜜臀久久99精品久久久久久小说| 久久精品午夜一区二区福利| 亚洲国产精品婷婷久久| 精品一久久香蕉国产线看播放| 精品熟女少妇aⅴ免费久久| 久久男人AV资源网站| 综合网日日天干夜夜久久| 狠狠色丁香久久综合五月| 久久AⅤ人妻少妇嫩草影院| 久久人做人爽一区二区三区| 久久99久久99精品免视看动漫| 伊人久久综在合线亚洲2019 | 91久久福利国产成人精品| 国产日韩久久久精品影院首页| 亚洲人成无码www久久久| 亚洲色大成网站WWW久久九九| 日本精品久久久久中文字幕8| 伊人久久成人成综合网222| 日韩精品久久久久久久电影蜜臀| 欧美综合天天夜夜久久| 久久午夜福利无码1000合集| 久久99国产精品二区不卡| 久久无码AV中文出轨人妻| 99久久人人爽亚洲精品美女| 色诱久久久久综合网ywww| 日产久久强奸免费的看|