內(nèi)存管理是我們在編程時經(jīng)常遇到的問題咽笼,而關(guān)于內(nèi)存管理的問題往往會導(dǎo)致我們無從下手,這篇隨筆是我閱讀《高質(zhì)量C++》第7章“內(nèi)存管理”時一些總結(jié)戚炫。
1.內(nèi)存分配方式
在C++中內(nèi)存分為5個區(qū)剑刑,分別是堆、棧双肤、自由存儲區(qū)施掏、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。
堆:堆是操作系統(tǒng)中的術(shù)語茅糜,是操作系統(tǒng)所維護(hù)的一塊特殊內(nèi)存七芭,用于程序的內(nèi)存動態(tài)分配,C語言使用malloc從堆上分配內(nèi)存蔑赘,使用free釋放已分配的對應(yīng)內(nèi)存狸驳。
棧:在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建缩赛,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放耙箍。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高酥馍,但是分配的內(nèi)存容量有限辩昆。
自由存儲區(qū):自由存儲區(qū)是C++基于new操作符的一個抽象概念,凡是通過new操作符進(jìn)行內(nèi)存申請旨袒,該內(nèi)存即為自由存儲區(qū)汁针。
全局/靜態(tài)存儲區(qū):這塊內(nèi)存是在程序編譯的時候就已經(jīng)分配好的,在程序整個運(yùn)行期間都存在峦失。例如全局變量扇丛,靜態(tài)變量术吗。
常量存儲區(qū):這是一塊比較特殊的存儲區(qū)尉辑,他們里面存放的是常量(const),不允許修改较屿。
Ps:關(guān)于new和malloc之間的區(qū)別請參考下面這篇博客隧魄,里面徹底的講解了這二者之間的區(qū)別和聯(lián)系
http://www.cnblogs.com/QG-whz/p/5140930.html
2.常見的內(nèi)存錯誤及解決方法
a.內(nèi)存分配未成功卓练,卻使用了它。
解決方法:在使用內(nèi)存之前檢查指針是否為NULL购啄。如果指針p是函數(shù)的參數(shù)襟企,那么在函數(shù)的入口處用assert(p!=NULL)進(jìn)行檢查。如果是用malloc來申請內(nèi)存狮含,應(yīng)該用if(p==NULL) 或if(p!=NULL)進(jìn)行防錯處理顽悼。如果是用new來申請內(nèi)存,申請失敗是會拋出異常几迄,所以應(yīng)該捕捉異常來進(jìn)行放錯處理蔚龙。(感謝@melonstreet指出)。
b.內(nèi)存分配雖然成功映胁,但是尚未初始化就引用它木羹。
解決方法:盡管有時候缺省時會自動初始化,但是無論創(chuàng)建什么對象均要對其進(jìn)行初始化解孙,即便是賦零值也不可省略坑填,不要嫌麻煩。
c.內(nèi)存分配成功弛姜,但越界訪問脐瑰。
解決方法:對數(shù)組for循環(huán)時要把握邊界,否則可能會導(dǎo)致數(shù)組越界廷臼。
d.忘記了釋放內(nèi)存蚪黑,導(dǎo)致內(nèi)存泄漏。
解決方法:動態(tài)內(nèi)存的申請和釋放必須配對中剩,new-delete和malloc-free且使用次數(shù)必須相同忌穿。 c.已經(jīng)釋放內(nèi)存卻仍然使用它结啼。
有三種情況:
1.程序中對象的關(guān)系過于復(fù)雜,難以搞清哪個對象是否已經(jīng)釋放了內(nèi)存掠剑。
2.函數(shù)中return寫錯,返回了指向棧中的指針或引用。
3. free或delete后,沒有將指針設(shè)為NULL,產(chǎn)生”野指針”郊愧。
C++ 內(nèi)存管理1
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門狡逢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宁舰,“玉大人,你說我怎么就攤上這事奢浑÷瑁” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵雀彼,是天一觀的道長壤蚜。 經(jīng)常有香客問我,道長徊哑,這世上最難降的妖魔是什么仍律? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮实柠,結(jié)果婚禮上水泉,老公的妹妹穿的比我還像新娘。我一直安慰自己窒盐,他們只是感情好草则,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟹漓,像睡著了一般炕横。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葡粒,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盒让!你這毒婦竟也來了梅肤?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對情侶失蹤邑茄,失蹤者是張志新(化名)和其女友劉穎姨蝴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肺缕,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡左医,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年授帕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒辉。...
- 正文 年R本政府宣布缝裤,位于F島的核電站,受9級特大地震影響颊郎,放射性物質(zhì)發(fā)生泄漏憋飞。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一姆吭、第九天 我趴在偏房一處隱蔽的房頂上張望榛做。 院中可真熱鬧,春花似錦内狸、人聲如沸检眯。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽锰瘸。三九已至,卻和暖如春昂灵,著一層夾襖步出監(jiān)牢的瞬間避凝,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓撑螺,卻偏偏與公主長得像佩谣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子实蓬,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- C語言中內(nèi)存分配 在任何程序設(shè)計(jì)環(huán)境及語言中茸俭,內(nèi)存管理都十分重要。在目前的計(jì)算機(jī)系統(tǒng)或嵌入式系統(tǒng)中安皱,內(nèi)存資源仍然是...
- (JG-2014-08-20)(前半部分經(jīng)過網(wǎng)上多篇文章對比整理)(后半部分根據(jù)ExceptionalCpp调鬓、C+...
- 1. C++基礎(chǔ)知識點(diǎn) 1.1 有符號類型和無符號類型 當(dāng)我們賦給無符號類型一個超出它表示范圍的值時,結(jié)果是初始值...
- __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用酌伊,...
- 今天上班的腾窝,碰到了一位買香水很猶豫的顧客缀踪,遲遲下不了決定,總覺得選擇a后虹脯,還會有更好聞更合適的b驴娃,于是在搖擺不定下...