作者:yangqi916
鏈接:http://www.reibang.com/p/cdfde318d5ee
來源:簡書
1.內(nèi)存分配方式
在C++中內(nèi)存分為5個(gè)區(qū),分別是堆轧粟、棧遭庶、自由存儲(chǔ)區(qū)蟆技、全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)加缘。
堆:堆用于程序的內(nèi)存動(dòng)態(tài)分配,C語言使用malloc從堆上分配內(nèi)存霹娄,使用free釋放已分配的對(duì)應(yīng)內(nèi)存能犯。
棧:在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建犬耻,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放踩晶。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高香追,但是分配的內(nèi)存容量有限合瓢。
自由存儲(chǔ)區(qū):自由存儲(chǔ)區(qū)是C++基于new操作符的一個(gè)抽象概念坦胶,凡是通過new操作符進(jìn)行內(nèi)存申請(qǐng)透典,該內(nèi)存即為自由存儲(chǔ)區(qū)。
全局/靜態(tài)存儲(chǔ)區(qū):這塊內(nèi)存是在程序編譯的時(shí)候就已經(jīng)分配好的顿苇,在程序整個(gè)運(yùn)行期間都存在峭咒。例如全局變量,靜態(tài)變量纪岁。
常量存儲(chǔ)區(qū):這是一塊比較特殊的存儲(chǔ)區(qū)凑队,他們里面存放的是常量(const),不允許修改。
malloc與new的區(qū)別:
http://www.reibang.com/writer#/notebooks/14660241/notes/17058500
常見的內(nèi)存錯(cuò)誤及解決方法
a.內(nèi)存分配未成功漩氨,卻使用了它西壮。
解決方法:在使用內(nèi)存之前檢查指針是否為NULL。如果指針p是函數(shù)的參數(shù)叫惊,那么在函數(shù)的入口處用assert(p!=NULL)進(jìn)行檢查款青。如果是用malloc來申請(qǐng)內(nèi)存,應(yīng)該用if(p==NULL) 或if(p!=NULL)進(jìn)行防錯(cuò)處理霍狰。如果是用new來申請(qǐng)內(nèi)存抡草,申請(qǐng)失敗是會(huì)拋出異常,所以應(yīng)該捕捉異常來進(jìn)行放錯(cuò)處理蔗坯。
b.內(nèi)存分配雖然成功康震,但是尚未初始化就引用它。
解決方法:盡管有時(shí)候缺省時(shí)會(huì)自動(dòng)初始化宾濒,但是無論創(chuàng)建什么對(duì)象均要對(duì)其進(jìn)行初始化腿短,即便是賦零值也不可省略,不要嫌麻煩绘梦。
c.內(nèi)存分配成功答姥,但越界訪問。
解決方法:對(duì)數(shù)組for循環(huán)時(shí)要把握邊界谚咬,否則可能會(huì)導(dǎo)致數(shù)組越界鹦付。
d.忘記了釋放內(nèi)存,導(dǎo)致內(nèi)存泄漏择卦。
解決方法:動(dòng)態(tài)內(nèi)存的申請(qǐng)和釋放必須配對(duì)敲长,new-delete和malloc-free且使用次數(shù)必須相同。
e.已經(jīng)釋放內(nèi)存卻仍然使用它秉继。
有三種情況:
1.程序中對(duì)象的關(guān)系過于復(fù)雜,難以搞清哪個(gè)對(duì)象是否已經(jīng)釋放了內(nèi)存祈噪。
2.函數(shù)中return寫錯(cuò),返回了指向棧中的指針或引用。
3. free或delete后,沒有將指針設(shè)為NULL,產(chǎn)生”野指針”尚辑。