1、內(nèi)存泄漏。
原因:代碼中的錯(cuò)誤導(dǎo)致。
2、內(nèi)存碎片。
原因:動(dòng)態(tài)分配內(nèi)存時(shí)內(nèi)存使用不當(dāng)導(dǎo)致的。
內(nèi)存泄漏:
使用new分配空間時(shí),最后沒有用delete釋放它,導(dǎo)致它一直占用內(nèi)存,發(fā)生內(nèi)存泄漏。
例如,如果丟失了已經(jīng)分配內(nèi)存的堆內(nèi)存地址,因?yàn)楦膶懥擞糜谠L問它的指針中的地址。這是一個(gè)很常見的問題,比如循環(huán)中,不斷向內(nèi)存空間申請(qǐng)內(nèi)存,在內(nèi)存空間中消耗內(nèi)存的越來越多,在分配完空間后,再次申請(qǐng)內(nèi)存時(shí),出現(xiàn)錯(cuò)誤,申請(qǐng)內(nèi)存失敗。
解決或者說避免這個(gè)問題的辦法,就是在用new分配完空間后,在恰當(dāng)?shù)奈恢冕尫艃?nèi)存。那什么是恰當(dāng)?shù)奈恢茫壳‘?dāng)?shù)奈恢镁褪窃谶@塊內(nèi)存使用完,后面不再使用它時(shí),將他釋放。
拿指針舉個(gè)例子,指針是有作用域的,作用域范圍是從定義它的地址開始,到他結(jié)束,用完后這個(gè)指針就不存在了,但他所占的內(nèi)存仍然存在,如果不及時(shí)的釋放他,他就會(huì)一直占用內(nèi)存,所以在指針的作用域結(jié)束的地方用delete釋放他就行。
內(nèi)存碎片:
內(nèi)部碎片就是已經(jīng)被分配出去(能明確指出屬于哪個(gè)進(jìn)程)卻不能被利用的內(nèi)存空間。
(1)、內(nèi)部產(chǎn)生的碎片
內(nèi)存分配必須起始于可被 4、8 或 16 整除,這就導(dǎo)致,我在申請(qǐng)23個(gè)內(nèi)存時(shí),電腦會(huì)給我批下24個(gè)內(nèi)存,然后我還不用那1個(gè)內(nèi)存,導(dǎo)致出現(xiàn)多個(gè)1內(nèi)存。這一個(gè)內(nèi)存就是多余的空間,叫做內(nèi)部碎片。
(2)、外部產(chǎn)生的碎片
頻繁的分配與回收物理頁面會(huì)導(dǎo)致大量的、連續(xù)且小的頁面塊夾雜在已分配的頁面中間,就會(huì)產(chǎn)生外部碎片。
如圖:
但這個(gè)問題少見,只需稍加知道即可。