線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:725
推到 Plurk!
推到 Facebook!

請問 delete 之後再遇到 delete 的話會怎樣?

尚未結案
kaworu
一般會員


發表:7
回覆:6
積分:2
註冊:2005-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-31 20:47:57 IP:59.104.xxx.xxx 未訂閱
這個問題發生在我做 Circular Linked List 的時候 有一個 function( List &B ) 是將另一個 List B 接到自己後面    例如有一個 List A 內容有 4 個 Node,而另一個 List B 內容有 3 個 Node    List A: NodeA1→NodeA2→NodeA3→NodeA4    List B: NodeB1→NodeB2→NodeB3    現在經過 A.funtion( B ) 處理過後 List A 會變成: NodeA1→NodeA2→NodeA3→NodeA4→NodeB1→NodeB2→NodeB3 又因為是 Circular Linked List,所以 NodeB3 的 nextLink 會指向 NodeA1    如果這時呼叫用來刪除 List 的 function 那把 List B 刪掉的話可以,但是接下來要刪 List A 的話就出錯了 出現的錯誤是無限廻圈    我的 delete function 如下:
for( ListNode* del=first; first && del!=last; del=first ){
        first = first->nextNode;
        delete del;
}
delete last;
如字面 first 指向 List 的第一個 Node,last 指向最後一個 Node 但因前面 A.funtion( B ) 的關係 此時 A.first 指向 NodeA1,A.last 指向 NodeB3,B.first 指向 NodeB1,而 B.last 一樣指向 NodeB3 我主要無法理解的地方是在刪除 List B 之後,整個 List A 會變怎樣 List A 中的 NodeA4 是指向 NodeB1,但 NodeB1 被刪了以後,NodeA4 會指向何處?還能存取該地方嗎? 是個奇怪的問題,希望有人能懂,謝謝。
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-31 23:10:00 IP:221.169.xxx.xxx 未訂閱
改用記憶體指標的觀點來想就很清楚 假設NodeA1在記憶體空間的指標為MemA1、其餘同 則 NodeA1->NextNode 指到 MemA2... 現在 NodeA4->NextNode指到 MemB1 當NodeB1刪除之後, NodeA4->NextNode 還是指到 MemB1 這個地方 但這裡的空間已經歸還給OS,此空間有可能配置給其他人 若要嘗試再把MemB1指到的空間當成List來使用,就會得到一個"access violate"(「記憶體違規存取」,不知道有沒有拼對 ^^") 比較正規的作法是,當你刪除了任一個節點後,就應該把這個節點的前後兩個節點連在一起 這樣才符合 Circular Linked List的規範
kaworu
一般會員


發表:7
回覆:6
積分:2
註冊:2005-05-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-01 00:48:06 IP:59.104.xxx.xxx 未訂閱
justdo 您好: 如果是刪除某個節點的話,我確實是有把前後兩個節點給連起來 但這個地方刪除的不是節點,而是一整個 List    並且,如果已歸還的空間又拿來用會出現 AV 的話 為何在我的 delete function 中,當 first 指到 NodeA4 時 再執行 first = first->nextNode; 不會出現 AV > > < class="code"> for( ListNode* del=first; first && del!=last; del=first ){ first = first->nextNode; // NodeA4 → NodeB1 delete del; } delete last; 後來發現這個問題在解構子的地方也會出現一樣的問題.....
yhchu
一般會員


發表:2
回覆:70
積分:24
註冊:2004-01-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-01 14:11:53 IP:220.130.xxx.xxx 未訂閱
first = first->nextNode; 不會出現 AV。因為只是改變 first 指標變數的內容,對他指向的記憶體位址尚未做其他可能造成 AV 的動作。 好比說, int i; int* p=&i; p ; 在 p 時不會有錯誤的。這也是 C 之所以低階且難以除錯的地方。
系統時間:2024-05-18 6:39:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!