1. 程式人生 > >[原始碼和文件分享]基於過載演算法的記憶體洩漏檢測和記憶體越界檢測

[原始碼和文件分享]基於過載演算法的記憶體洩漏檢測和記憶體越界檢測

通過過載`new`,`delete`實現對在動態記憶體分配中記憶體越界和記憶體洩露的自動檢測

1. 記憶體洩漏

1.1 簡介

`記憶體洩漏`是當程式不正確地進行記憶體管理時出現的一種資源洩漏,表現為程式不再需要使用的記憶體空間並沒有及時被釋放掉。記憶體洩漏並非指實體記憶體的消失,而是在程式分配了某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,造成了記憶體的浪費.

1.2 危害

記憶體洩漏減少計算機可用記憶體,從而影響了計算機的效能。如果記憶體洩漏過於嚴重,整個作業系統、應用程式甚至會崩潰,計算機效能會大打折扣。但是,一般情況下,在現代作業系統中,當一個應用程式結束的時候,該應用程式所佔用的記憶體會被作業系統自動地全部釋放,因此,記憶體洩漏的後果往往不會很嚴重,甚至不會被察覺到。但是,當長時間執行程式或者裝置記憶體較小時,記憶體洩漏的問題就不容忽視。作為程式設計師,我們有必要盡力避免記憶體洩漏,養成良好的程式設計習慣.

1.3 分類

記憶體洩漏尤其會發生在沒有垃圾回收機制(Garbage collection)的程式語言,例如:C和C++,也就是說程式並不會自動實現記憶體管理。對於C和C++這兩種語言,我們主要關心兩種型別的記憶體洩漏:

  • 堆記憶體洩漏:程式通過`malloc`,`realloc`,`new`等函式在堆空間中申請了一塊記憶體,但是在使用完後並沒有用`free`,`delete`等函式將所申請的記憶體的記憶體釋放掉,導致相應的那塊記憶體一直被佔用。

  • 系統資源洩漏:程式在使用系統分配的資源比如Bitmap,handle等之後,並沒有用相應的函式釋放掉,導致相應記憶體的佔用和系統資源的浪費。

本次只針對堆記憶體洩漏提出自動檢測的方法。

1.4 解決記憶體洩漏

解決記憶體洩漏的困難之處在於:

  • 編譯器不能發現這些問題

  • 在程式執行時才有可能捕捉到這些錯誤,而且這些錯誤沒有明顯的症狀,時隱時現

  • 一般解決記憶體洩漏必須需要程式設計師獲得原始碼,通過修改原始碼的方式解決,比較耗時

因此,我們需要想出一種簡便的方法,可以較大程度地自動檢測出記憶體洩漏,及時提醒程式設計師對程式進行修正,在此我們通過過載`new`、`delete`函式的方式實現了自動檢測的功能,下面將介紹`new`和`delete`函式。


參考文件和完整的文件和原始碼下載地址:

https://www.write-bug.com/article/106.html