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