記憶體洩漏, 記憶體空洞(記憶體碎片)

2021-08-15 05:57:13 字數 859 閱讀 3307

記憶體洩漏:

在堆空間, malloc/free要分配使用。要是記憶體分配了我們不釋放稱為記憶體洩漏;

記憶體洩漏多了遲早會出現out of memory的錯誤,再分配記憶體就會失敗。淡然釋放時也只能釋放分配出來的空間,釋放無效的記憶體或者重複釋放都是不行的,會造成程式crash。分配多少記憶體用多少,不管讀寫,讀多了會讀到隨機資料,寫多了會造成隨機破壞,這種情況我們稱為緩衝區溢位。這是非常嚴重的,大部分安全問題都是由緩衝區溢位馬起的。手工檢查有沒有記憶體洩漏或者緩衝區溢位是很困難的,幸好有些工具可以使用,例如linux下有valgrind,它的使用方法很簡單,大家可以試用一下,以後每次寫完程! 予都應該用valgrind跑一遍。

記憶體碎片:

程式長時間執行後,由於不停的malloc/free操作,儘管不存在記憶體洩露,但程式所占用的記憶體空間越來越大,有時候還會導致malloc申請失敗,這就是由於記憶體碎片所導致。

產生原因: 

非mmap申請的記憶體,其釋放,只能從堆頂開始。中間部分的記憶體即使通過free釋放掉,但仍然是被當前程式所占用,並未徹底釋放到堆中,無法供其他程式使用。只有堆頂部分記憶體也釋放後,這片區域才能融合成一大片空間。

解決方案: 

此問題沒有最終的完美的解決方案。

盡可能多採用記憶體空間的復用,減少頻繁申請大量小的記憶體塊的操作。

對程式所需要的動態記憶體進行統一規劃。把需要長時間占用的記憶體的申請操作,在程式剛啟動後初始化時進行,把不需要長時間占用的記憶體的申請操作,後執行。這樣堆頂可以盡早釋放。 

但要注意的是,記憶體分配不一定是順序的,即後來申請的記憶體位址不一定就比原來的記憶體位址大,可能用了之前釋放的一片區域。

通過動態記憶體管理模組封裝記憶體的申請和釋放。

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

結構體 記憶體空洞

結構體 作用 封裝資料。結構體需要注意的是記憶體空洞問題 如下面的例子 struct node int main 正常分析輸出結果應該為1 4 1 6 可輸出結果為12 因為第乙個char系統為它分配4個位元組,可它只用得到乙個位元組,剩餘3個閒置。第二個是int型,佔四個位元組,前面只剩3個位元組...

記憶體溢位和記憶體洩漏

記憶體溢位 oom 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現oom 記憶體洩露memory leak 指程式在申請記憶體後,無法釋放已申請的記憶體空間,一直占用著這塊記憶體空間。記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢位。記憶體洩漏是指你向系統...