2011-01-22 108 views
2

我正在運行valgrind查找內存泄漏。我在主函數中分配了兩個全局變量;然後,在main我解放了,但Valgrind的不斷書寫結束:Valgrind和全局變量

==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2 
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==18311== by 0x804A30C: main (application.c:730) 
==18311== 
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2 
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==18311== by 0x804A31D: main (application.c:731) 

泄漏摘要:

==18311== LEAK SUMMARY: 
==18311== definitely lost: 32 bytes in 2 blocks 
==18311== indirectly lost: 0 bytes in 0 blocks 
==18311==  possibly lost: 0 bytes in 0 blocks 
==18311== still reachable: 0 bytes in 0 blocks 
==18311==   suppressed: 0 bytes in 0 blocks 

爲什麼我不能釋放這兩個變量?

編輯

someList *something; *something_else; 

使用的結構有char *類型的兩個字段和字段someList *next。 後來有很多代碼。一些線程將使用這兩個變量來添加/編輯/刪除對象。

something -> object 1 -> ... -> object n 
something_else -> object 1 -> ... -> object m 

->意味着something->next = object 1,和object ksomeList *所有實例。

在應用程序結束時,我釋放了每個object k元素的每個字段。然後,在最後一部分:

free(something); 
free(something_else); 

這是可能的,我忘了釋放一個對象的字段。這會導致我在這裏的行爲嗎?

我希望現在更清楚。

+0

是你執行它們的代碼的一部分嗎?主函數的早期返回可能會跳過它。 – CodesInChaos 2011-01-22 13:32:25

+1

需要查看代碼。 – SoapBox 2011-01-22 13:32:53

回答

0

對於每個malloc()調用,您通常都需要調用相應的free(),以避免內存泄漏。爲了獲得最佳的內存使用量,您應該在完成每個分配的內存塊後儘快分配內存塊。

你的情況,你有application.c:730application.c:731 2個malloc()呼叫,其中有沒有free()調用你的程序終止時提出的。因此,分配的內存塊不會被釋放。這會導致內存泄漏,Valgrind檢測並報告。

除非您向我們提供一些關於您的程序的代碼和/或更多信息,否則我們無法爲您提供更多幫助。

編輯:

有兩個有趣的線在你Valgrind輸出:

==18311== definitely lost: 32 bytes in 2 blocks 
... 
==18311== still reachable: 0 bytes in 0 blocks 

你肯定會「失去」兩個內存塊,有沒有指針指向它們在你的程序終止的時間。這意味着這兩個塊的指針實際上被覆蓋或者在程序過程中失去了它們的價值。

這個問題的一個常見原因是將兩個malloc()調用的結果存儲到同一個指針,而沒有調用中間free()。另一個可能的原因是由於指針算術運算而改變了指針值 - Valgrind努力檢測其中的一些情況,但並不總是成功的,這取決於您的代碼。

1

您確定要釋放所有變量嗎? Valgrind說你不是。

試着讓你的代碼變得苗條,把它發佈到這裏,或者運行一些更多的調試。