2010-06-02 71 views
1

我一直在爲這個程序工作五個月了。它是傳感器網絡的實時應用。我在程序的生命週期中創建了幾個鏈表,並使用malloc在鏈接中創建一個新節點。會發生什麼情況是程序突然停止或發瘋並重新啓動。我使用AVR和微控制器是ATMEGA 1281.經過大量調試後,我發現malloc導致了這個問題。在退出創建新鏈接的函數後,我不釋放內存,所以我猜這最終導致堆內存溢出或類似的東西。現在,如果我使用free()函數在使用malloc函數結束時釋放內存,則當控件達到free()時,程序會卡住。這是因爲在調用free()之後內存變得太聚集了嗎?在鏈表中使用malloc的問題

我還創建了參考表,例如,如果'head'是一個新的鏈接列表,並且我創建了另一個名爲current的列表並使其等於head。

table *head; 
table *current = head; 

功能結束後,如果我用免費

free(current); 
current = NULL: 

然後程序被困在這裏。

我不知道該怎麼做。我究竟做錯了什麼?有沒有辦法增加堆內存的大小?

回答

2

是否需要在函數調用malloc()的末尾釋放一個塊應由調用後內存塊是否仍然使用來決定。如果它正在成爲列表中的一個節點,那麼你應該在該函數的末尾釋放它,而不是而不是。如果它在通話期間用於臨時工作記憶,那麼你必須在最後釋放它,否則你最終會耗盡你的堆。從列表中刪除時,您必須釋放該塊。

在任何情況下,在實時系統(無虛擬內存)中使用小內存塊(即鏈表操作)上的malloc()和free()都會導致最終的堆碎片。

你需要做的是使用一塊內存塊並回收緩衝區。你正在運行RTOS還是裸機?如果你看,現有的內存池庫可用。你也可以編寫一個,但除非你真的在這方面有經驗,否則創建一個比沒有庫更糟糕的東西相對容易。

如果您需要更具體的建議,請提供更多詳細信息。