回答
我想明顯的答案是,結構中的泄漏是當指向分配內存的指針駐留在結構中並且結構在其成員指向的內存被釋放之前超出範圍時。這將通過釋放結構內部指向的任何內存,然後釋放(或放棄示波器)結構來解決。
敢肯定這是這個問題是問什麼... :)
重要的一點要記住的是:
動態內存總是被分配以及釋放明確。
每當你使用malloc
分配給一個指針內存,並沒有專門調用free
對同一指針/傳遞同一地址free
它導致泄漏
在結構的情況下,內存,只要你有一個使用malloc
分配動態內存的指針成員,那麼它應該明確free
通過調用free
未能這樣做會導致內存泄漏。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
struct MyStruct
{
char *str;
int i;
};
int main()
{
struct MyStruct *ptr = (struct MyStruct *)malloc(sizeof(*ptr));
ptr->i = 10;
/*str is allocated dynamic memory*/
ptr->str = malloc(10);
strncpy(ptr->str,"Hello",6);
printf("[%d]",ptr->i);
printf("[%s]",ptr->str);
/*Frees memory allocated to structure*/
/*But Oops you didn't free memory allocated to str*/
/*Results in memory leak*/
//free(ptr);
/*Correct order of deallocation*/
/*free member memory*/
free(ptr->str);
/*free structure memory*/
free(ptr);
return 0;
}
我知道你只是試圖清楚OP,但明確的部分是錯誤的。例如,很多庫malloc的內存,並要求「客戶端」釋放該內存。某些集合可能會自動釋放元素,或使用RAII策略(不需要明確的免費通話)。在保守的垃圾收集器中使用C是非常簡單的,在這種垃圾收集器中free沒有被顯式調用。 – Heptic 2011-12-26 11:34:09
@Heptic:明確地說,部分是非常正確的,除非任何使用的api或數據結構另有說明。 – 2011-12-26 11:57:02
請看一看Dynamic memory allocation in C
其動態存儲器分配期間發生/免費的常見錯誤如下[其說明here]
不當動態內存分配的使用經常會成爲錯誤的根源。
最常見的錯誤是:
- 分配失敗:內存分配不能保證成功。如果沒有執行成功分配的檢查,通常會導致程序或整個系統崩潰。
- 內存泄漏:未能使用
free
釋放內存導致內存堆積不可重用,內存不再被程序使用。這會浪費內存資源,並在這些資源耗盡時導致分配失敗。 - 邏輯錯誤:所有分配必須遵循相同的模式:使用
malloc
分配,用於存儲數據,使用free
解除分配。無法遵守此模式,例如免費通話後或在致電malloc
後撥打free
兩次後的內存使用情況等。通常會導致程序崩潰。
上述內容適用於structures
,也適用於C
的其他構造。
希望這會有所幫助!
- 1. 這會泄漏內存嗎?我怎樣才能防止它?
- 2. 我怎樣才能消除這些泄漏?我附上快照
- 3. Matplotlib錯誤導致內存泄漏。我怎樣才能釋放內存?
- 4. 爲什麼這是內存泄漏
- 5. DOM:爲什麼這是內存泄漏?
- 6. iphone - 我怎樣才能得到這個alertView泄漏?
- 7. 我怎樣才能縮短這一點?
- 8. 簡單程序的內存泄漏,我怎樣才能免費分配?
- 9. Python:CTypes結構內存泄漏
- 10. 這是可能的內存泄漏嗎?
- 11. 是內存泄漏?爲什麼java.lang.ref.Finalizer吃了這麼多內存
- 12. xCode - 爲什麼這個內存泄漏?
- 13. 這是內存泄漏嗎?
- 14. 這是內存泄漏嗎?
- 15. 這是內存泄漏嗎?
- 16. 這是內存泄漏嗎?
- 17. 這是內存泄漏嗎?
- 18. 什麼是CLASS:wxWindowNR在AutoIt中,我怎樣才能點擊控件?
- 19. 我怎樣才能比較結構
- 20. 爲什麼我的CCParticleExplosion泄漏內存?
- 21. 爲什麼我的shared_ptr泄漏內存?
- 22. 正則表達式 - 我怎樣才能做到這一點?
- 23. 這是內存泄漏嗎?應該怎麼做?
- 24. 爲什麼這是一個內存泄漏?
- 25. 我們怎樣才能在一次robotframework
- 26. 我發現什麼樣的對象導致內存泄漏,現在是什麼?
- 27. 這不是一個內存泄漏
- 28. 這是一個php內存泄漏?
- 29. 我怎樣才能糾正谷歌地圖上的標記
- 30. 我怎樣才能知道這是做什麼?
http://en.wikipedia.org/wiki/Memory_leak – bobbymcr 2011-12-26 09:08:12
我以爲它有點不同於普通內存泄漏 – 2011-12-26 09:14:33