請問 delete 之後再遇到 delete 的話會怎樣? |
尚未結案
|
kaworu
一般會員 發表:7 回覆:6 積分:2 註冊:2005-05-17 發送簡訊給我 |
這個問題發生在我做 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如字面 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 發送簡訊給我 |
改用記憶體指標的觀點來想就很清楚 假設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 發送簡訊給我 |
justdo 您好:
如果是刪除某個節點的話,我確實是有把前後兩個節點給連起來
但這個地方刪除的不是節點,而是一整個 List 並且,如果已歸還的空間又拿來用會出現 AV 的話
為何在我的 delete function 中,當 first 指到 NodeA4 時
再執行 first = first->nextNode; 不會出現 AV
> >
< class="code">
for( ListNode
|
yhchu
一般會員 發表:2 回覆:70 積分:24 註冊:2004-01-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |