2011-05-29 33 views
1

我正在使用Dijkstra找到完成某個謎題的最短路徑,其中謎題的工作方式如下。你有五個密碼子,可以是-4到4之間的任何一個(雖然它們的表示方式不同,-4/4爲「非常低/高」,-3至-1或1至3爲「低/高」 ,並且「完成」爲0)。其目標是將所有五個設置爲0,使用20種不同的「技術」,將密碼值提高/降低一定量。如果某種技術會在邊界之外修改其中一個密碼,即高於4或低於-4,那麼它將不會執行任何操作。所以,我將它表示爲一個圖,其中節點是密碼值的所有可能的組合,起始節點是完成的節點(0,0,0,0,0)。爲了更容易,我將密碼錶示爲從0到8的值,其中4是完整值 - 這使我可以將它們的基數9轉換爲圖的數組索引,因此不會浪費在搜索上。我的Dijkstra算法中可能存在的free()問題

現在,我已經把它全部剔除了,而且我一直在調試並試圖弄清楚什麼是錯誤的,通常我會找出問題並修復它 - 但是這個讓我難住。我存儲的節點有確定的距離,但沒有在鏈表中訪問,以便輕鬆彈出訪問節點。當鏈表到達14256個節點時,它會失敗 - 但是它沒有做的是在鏈表元素上的一個free()被彈出。我不知道什麼可能導致免費()失敗,我還沒有找到任何幫助。

我之前沒有問過任何問題,所以我不知道禮節 - 我將把整個資料放在這裏,因爲我不知道在這種特殊情況下什麼是和不相關的,但它大約有140條線,比較大。在進一步細讀時,似乎並沒有真正的標籤或任何東西,所以我現在就把它放在鍵盤上。

http://codepad.org/I0K0ETsU

編輯:好的。好的。現在我變得徹底困惑。我決定只是對它進行評論,否則就沒有什麼問題了。它結束,吐出output.txt,並且文本文件看起來是完全正確的。我無法弄清楚在沒有別的錯誤的情況下,代碼中的內容會導致它在free()上崩潰。

+0

什麼樣的失敗? – 2011-05-29 00:53:53

+0

Windows只會關閉它,並說「有問題導致程序無法正常工作。」 – Santiclause 2011-05-29 01:09:29

回答

0

事實證明,問題在於我沒有在malloc()的字符串長度內包含\ 0字符。

1

經過粗略的審查後,它看起來像池 - >下一步被初始化爲溫度,並在那個時候,temp-> next是未初始化。所以,當你將列表放到temp-> next並嘗試釋放它時,你將釋放未初始化的指針(或者你不擁有的內存)。

+0

如果temp-> next未初始化(我不認爲),它不應該嘗試釋放temp-> next - 根項目池的值是鏈接列表中元素的總數,因此遍歷鏈表不會超出邊界,以達到未初始化的指針。 – Santiclause 2011-05-29 01:08:25

1

一個free通常會失敗,只有幾個原因:

  • 嘗試釋放一個NULL指針
  • 嘗試釋放東西是之前已經free'd(雙免費)
  • 嘗試釋放無效的東西(即釋放垃圾地址)
  • 內存損壞(存儲有關已分配段的信息的區域已被溢出)
+3

這裏只是一個註釋,它實際上是一個完全安全的空指針調用free。 – 2011-05-29 00:56:25

+1

'man 3p free':如果ptr是空指針,則不會發生任何操作。先生,好的電話。 – 2011-05-29 00:58:43