青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

一個要引起注意的delete動作

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

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 即將被刪除的空間的一部分 再對一個已經不存在的指針進行操作當然就會崩潰 這樣就導致在對temp的引用是不存在的 所以出錯

                     delete list_tail;

                     list_head = NULL;

                     size = 0;

              }

              else

              {

                     return;

              }

       }

我還是很快發現了 但是很有覺得價值 所以寫下提醒自己

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

評論

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

不知道你之前的代碼是不是只是while那里不一樣,
個人感覺不是temp的問題,如果照你以前的寫法,應該是是最后的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; //這句不要了,因為delTemp 總是指向temp的前一個,當temp = list_tail->back時是在最后,此時delTemp = list_tail已刪除完整個鏈表,覺得如果你之前的語句只是while那里不一樣,應該是這里出錯了,不知道有沒有理解你原來的意思。覺得有點疑問

list_head = NULL;

size = 0;

}

else

{

return;

}

}

  回復  更多評論   

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

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

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

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

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

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

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

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

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

不過以后大家可以經常討論 這是好事情 我要謝謝你的  回復  更多評論   

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

你的clear函數只是清空了鏈表的內存空間listitem,并沒有刪除list這個對象,對象的刪除得由析構函數來執行
 

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

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


如果改成
 

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

  回復  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

還有說的“List_tail指向的內容被析構之后 系統就會給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

對于前面的節點時它們是一樣的,但在最后那個點時,即deltemp = list_tail時,然后temp = temp->back(就是NULL)了,然后系統把list_tail刪了,然后list_tail還指向那個系統單元(就是只是系統把房子里的人趕了出去,但門牌號還是那個),然后再進入循環條件,然后此時list_tail->back 引用就會出錯了,因為list_tail里面已經沒“人”了,在加一個back相當里面的一個人,所以會出錯,

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

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

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

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

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

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

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

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

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

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

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

acm亞洲銀獎?那很厲害的,同時呢我也參加過acm,也見過好多acm的同學的代碼,還有網上的一些比較厲害的人的代碼,因為他們追求的是速度,不管是算法效率,還是敲程序的速度,所以我看過的acm代碼的風格沒有你寫得好,我還記得我那時候見他們敲字得速度,驚訝得說不出話來了,呵呵  回復  更多評論   

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



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

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


在list_tail沒被刪除前,這兩句的確是一樣的,可list_tail->back被刪后,這就不一樣了,因為temp沒有引用->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會出錯,還是把兩個語句調換一下位置
這樣就能保證安全性了 呵呵




還是你提醒了我

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


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



謝謝你的指點啊,經過這樣討論,我覺得應該對指針和鏈表的認識又進一步了,謝謝你啊,呵呵  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

導航

統計

常用鏈接

留言簿(1)

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美大片在线观看| 国产精品乱码| 亚洲第一在线视频| 欧美大片第1页| 女女同性女同一区二区三区91| 亚洲电影免费在线观看| 嫩模写真一区二区三区三州| 嫩草成人www欧美| 一级成人国产| 西西人体一区二区| 在线观看欧美激情| 亚洲国产色一区| 欧美视频四区| 久久精品道一区二区三区| 久久aⅴ国产紧身牛仔裤| 亚洲大胆人体视频| 亚洲精品黄色| 国产欧美91| 欧美成人xxx| 国产精品99免视看9| 久久国内精品自在自线400部| 久久精品一区二区三区中文字幕| 亚洲国产成人av在线| 亚洲乱码国产乱码精品精98午夜 | 免费视频一区| 欧美日韩精品高清| 久久麻豆一区二区| 欧美日韩二区三区| 久久久亚洲国产美女国产盗摄| 欧美福利在线观看| 欧美在线观看视频一区二区| 久久这里只精品最新地址| 一本久道久久综合中文字幕| 亚洲永久精品国产| 91久久精品一区二区别| 亚洲图片你懂的| 亚洲欧洲精品成人久久奇米网| 中文久久精品| 亚洲精品国产拍免费91在线| 亚洲欧美日韩国产| 亚洲色图自拍| 久久综合影音| 久久中文在线| 国产精品中文字幕在线观看| 亚洲精品欧美在线| 亚洲国产精品电影| 欧美一区二区三区在线看| 亚洲精品影院在线观看| 欧美在线影院在线视频| 亚洲影院在线观看| 欧美精品一区二区三区在线看午夜 | 一区二区高清视频在线观看| 午夜精品久久久久久久99热浪潮 | 国产欧美一区二区精品性| 亚洲国产高清在线观看视频| 国产亚洲人成a一在线v站| 在线一区二区三区四区五区| 日韩视频一区二区三区在线播放| 久久久久久亚洲精品中文字幕| 羞羞色国产精品| 欧美日韩一二三区| 亚洲精品中文字| 99成人在线| 欧美日本高清视频| 亚洲第一页在线| 亚洲二区视频| 久久久av网站| 欧美 日韩 国产精品免费观看| 韩日视频一区| 久久免费黄色| 亚洲电影在线| 亚洲日本电影在线| 欧美肥婆在线| 日韩视频中文字幕| 亚洲一区二区三区高清不卡| 国产精品豆花视频| 亚洲在线中文字幕| 欧美一级大片在线免费观看| 国产精品成人久久久久| 亚洲免费电影在线| 亚洲欧美日韩综合| 国产欧美视频一区二区三区| 亚洲欧美激情精品一区二区| 欧美一区成人| 国产日产高清欧美一区二区三区| 亚洲欧美日韩国产一区| 久久久久久久国产| 91久久精品国产| 欧美日韩成人一区二区| 亚洲另类自拍| 久久精品亚洲| 亚洲伦理中文字幕| 欧美极品在线视频| 一区二区国产精品| 性欧美精品高清| 极品少妇一区二区三区精品视频| 欧美成人精品高清在线播放| 91久久国产自产拍夜夜嗨| 一本一本大道香蕉久在线精品| 欧美日韩免费观看一区三区| 亚洲欧美中文日韩在线| 欧美激情日韩| 亚洲欧美国产一区二区三区| 国产亚洲精品aa午夜观看| 久久久精品久久久久| 亚洲毛片在线观看.| 欧美一级视频一区二区| 国产片一区二区| 久久亚洲图片| 中文久久乱码一区二区| 久久久综合网| 一区二区三区黄色| 国产一区二区欧美| 欧美日韩亚洲成人| 久久精品免视看| 夜夜夜久久久| 久久久伊人欧美| 中文av字幕一区| 红桃视频成人| 国产精品日日摸夜夜摸av| 欧美~级网站不卡| 欧美一区二区福利在线| 一本综合精品| 亚洲精品欧美专区| 女仆av观看一区| 欧美一区二区三区在线视频| 亚洲国产精品嫩草影院| 国产乱码精品一区二区三区av | 亚洲一区二区在线免费观看视频 | 91久久精品国产91久久性色| 久久久久久久久蜜桃| 亚洲欧美国产精品va在线观看| 亚洲国内欧美| 国模 一区 二区 三区| 国产精品美女久久久浪潮软件 | 欧美v国产在线一区二区三区| 亚洲免费在线播放| 在线亚洲成人| 亚洲天堂av综合网| 日韩视频免费观看| 亚洲精品国产拍免费91在线| 亚洲第一区中文99精品| 欧美成人免费大片| 欧美成人dvd在线视频| 嫩草伊人久久精品少妇av杨幂| 久久久国产一区二区| 久久精品首页| 久热精品在线视频| 欧美 日韩 国产 一区| 欧美aaaaaaaa牛牛影院| 欧美成人国产| 亚洲国产欧美不卡在线观看| 亚洲国产精品高清久久久| 亚洲福利视频在线| 亚洲国产精品精华液网站| 亚洲国产美国国产综合一区二区| 欧美丰满高潮xxxx喷水动漫| 欧美激情综合| av不卡在线| 亚洲欧美一区二区原创| 欧美伊久线香蕉线新在线| 久久久综合视频| 欧美大学生性色视频| 欧美日韩亚洲综合在线| 国产精品一二| 黄色成人在线| 99re热精品| 欧美一区二区三区在线观看 | 亚洲伦理一区| 亚洲欧美日本精品| 久久一区免费| 亚洲精品国产精品久久清纯直播 | 亚洲一区中文| 久久久久久久久岛国免费| 欧美a级大片| 欧美性猛交99久久久久99按摩| 国产麻豆精品久久一二三| 国产日韩欧美黄色| 亚洲精品网址在线观看| 亚洲欧美成人一区二区在线电影| 久久国产精品色婷婷| 亚洲激情av| 香蕉尹人综合在线观看| 免费日韩精品中文字幕视频在线| 国产精品黄页免费高清在线观看| 好吊色欧美一区二区三区四区| 91久久久亚洲精品| 先锋影音一区二区三区| 欧美国产大片| 午夜精品久久久久久久久久久久 | 在线视频你懂得一区二区三区| 亚洲免费视频在线观看| 久久综合九色99| 国产深夜精品| 亚洲欧洲三级| 久久人人爽人人爽爽久久| 亚洲精品久久久一区二区三区| 欧美一级电影久久| 欧美日韩黄视频| 亚洲另类自拍|