通過重載`new`,`delete`實現(xiàn)對在動態(tài)內(nèi)存分配中內(nèi)存越界和內(nèi)存泄露的自動檢測
1. 內(nèi)存泄漏
1.1 簡介
`內(nèi)存泄漏`是當程序不正確地進行內(nèi)存管理時出現(xiàn)的一種資源泄漏,表現(xiàn)為程序不再需要使用的內(nèi)存空間并沒有及時被釋放掉。內(nèi)存泄漏并非指物理內(nèi)存的消失,而是在程序分配了某段內(nèi)存后,由于設(shè)計錯誤,失去了對該段內(nèi)存的控制,造成了內(nèi)存的浪費.
1.2 危害
內(nèi)存泄漏減少計算機可用內(nèi)存,從而影響了計算機的性能。如果內(nèi)存泄漏過于嚴重,整個操作系統(tǒng)、應(yīng)用程序甚至?xí)罎?,計算機性能會大打折扣。但是,一般情況下,在現(xiàn)代操作系統(tǒng)中,當一個應(yīng)用程序結(jié)束的時候,該應(yīng)用程序所占用的內(nèi)存會被操作系統(tǒng)自動地全部釋放,因此,內(nèi)存泄漏的后果往往不會很嚴重,甚至不會被察覺到。但是,當長時間運行程序或者設(shè)備內(nèi)存較小時,內(nèi)存泄漏的問題就不容忽視。作為程序員,我們有必要盡力避免內(nèi)存泄漏,養(yǎng)成良好的編程習(xí)慣.
1.3 分類
內(nèi)存泄漏尤其會發(fā)生在沒有垃圾回收機制(Garbage collection)的編程語言,例如:C和C++,也就是說程序并不會自動實現(xiàn)內(nèi)存管理。對于C和C++這兩種語言,我們主要關(guān)心兩種類型的內(nèi)存泄漏:
堆內(nèi)存泄漏:程序通過`malloc`,`realloc`,`new`等函數(shù)在堆空間中申請了一塊內(nèi)存,但是在使用完后并沒有用`free`,`delete`等函數(shù)將所申請的內(nèi)存的內(nèi)存釋放掉,導(dǎo)致相應(yīng)的那塊內(nèi)存一直被占用。
系統(tǒng)資源泄漏:程序在使用系統(tǒng)分配的資源比如Bitmap,handle等之后,并沒有用相應(yīng)的函數(shù)釋放掉,導(dǎo)致相應(yīng)內(nèi)存的占用和系統(tǒng)資源的浪費。
本次只針對堆內(nèi)存泄漏提出自動檢測的方法。
1.4 解決內(nèi)存泄漏
解決內(nèi)存泄漏的困難之處在于:
編譯器不能發(fā)現(xiàn)這些問題
在程序運行時才有可能捕捉到這些錯誤,而且這些錯誤沒有明顯的癥狀,時隱時現(xiàn)
一般解決內(nèi)存泄漏必須需要程序員獲得源碼,通過修改源碼的方式解決,比較耗時
因此,我們需要想出一種簡便的方法,可以較大程度地自動檢測出內(nèi)存泄漏,及時提醒程序員對程序進行修正,在此我們通過重載`new`、`delete`函數(shù)的方式實現(xiàn)了自動檢測的功能,下面將介紹`new`和`delete`函數(shù)。

參考文檔和完整的文檔和源碼下載地址: