內(nèi)存泄漏的原因是什么
還記得小時候很愛聽歌,也很愛看電視劇,但是那個時候還沒有互聯(lián)網(wǎng),不能隨時隨地的想看什么就看什么。但是,幸好,我們有光碟。于是隨著時間的流逝,家里的光碟越來越多,已經(jīng)到了,放不下的地步。后來,科技發(fā)展,也出現(xiàn)了內(nèi)存卡啦,u盤啦。既小巧又容量大,于是大家都紛紛開始用這些來存儲自己的東西。但是過了一段時間,突然發(fā)現(xiàn)自己的內(nèi)存突然間變小了,這是為什么呢?學習啦小編今天就給大家揭秘一下內(nèi)存泄露的原因。
1.創(chuàng)建GDI對象后,比如LoadIcon,LoadImage,CreateImageList等等,沒有Destroy掉
2.創(chuàng)建DC后,比如GetDC(), 沒有釋放DC句柄
3.new,malloc后沒有delete,free
4.創(chuàng)建內(nèi)核對象(比如CreateFile,CreateMutex,CreateThread),后沒有釋放內(nèi)核對象句柄.
5.創(chuàng)建內(nèi)存映射文件,CreateFileMapping,MapViewOfFile后沒有CloseHandle(),UnMapviewofFile
6.保留虛擬地址空間 VirtualAlloc(),然后提交物理存儲器后,沒有釋放掉
內(nèi)存泄漏解釋
簡單的說就是申請了一塊內(nèi)存空間,使用完畢后沒有釋放掉。它的一般表現(xiàn)方式是程序運行時間越長,占用內(nèi)存越多,最終用盡全部內(nèi)存,整個系統(tǒng)崩潰。由程序申請的一塊內(nèi)存,且沒有任何一個指針指向它,那么這塊內(nèi)存就泄露了。
泄漏的分類
以發(fā)生的方式來分類,內(nèi)存泄漏可以分為4類:
(1). 一次性內(nèi)存泄漏。
發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會發(fā)生一次。
(2). 隱式內(nèi)存泄漏。
程序在運行過程中不停的分配內(nèi)存,但是直到結(jié)束的時候才釋放內(nèi)存。嚴格的說這里并沒有發(fā)生內(nèi)存泄漏,因為最終程序釋放了所有申請的內(nèi)存。但是對于一個服務(wù)器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。
(3). 常發(fā)性內(nèi)存泄漏。
發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏。
(4). 偶發(fā)性內(nèi)存泄漏。
發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內(nèi)存泄漏至關(guān)重要。
其實看了上面的介紹之后,大家可以發(fā)現(xiàn),其實內(nèi)存泄露不僅有它們自身質(zhì)量的原因,也有我們作為主人,在使用方法上的失誤。所以小編建議,如果要存儲一些比較重要的東西,最好是買一些質(zhì)量比較好的內(nèi)存卡。還有就是,朋友們最好能改進一下自己的使用方法,盡量延長他們的使用壽命。比如,盡量不要反復(fù)的存入,刪除,最好是能一次性存入。然后在電腦上使用的時候,盡量先查殺,然后再拔出。希望上面的內(nèi)容能對你有所幫助。