內存管理是我們在編程時經常遇到的問題,而關于內存管理的問題往往會導致我們無從下手,這篇隨筆是我閱讀《高質量C++》第7章“內存管理”時一些總結。
1.內存分配方式
在C++中內存分為5個區,分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
堆:堆是操作系統中的術語,是操作系統所維護的一塊特殊內存,用于程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。
棧:在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
自由存儲區:自由存儲區是C++基于new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即為自由存儲區。
全局/靜態存儲區:這塊內存是在程序編譯的時候就已經分配好的,在程序整個運行期間都存在。例如全局變量,靜態變量。
常量存儲區:這是一塊比較特殊的存儲區,他們里面存放的是常量(const),不允許修改。
Ps:關于new和malloc之間的區別請參考下面這篇博客,里面徹底的講解了這二者之間的區別和聯系
http://www.cnblogs.com/QG-whz/p/5140930.html
2.常見的內存錯誤及解決方法
a.內存分配未成功,卻使用了它。
解決方法:在使用內存之前檢查指針是否為NULL。如果指針p是函數的參數,那么在函數的入口處用assert(p!=NULL)進行檢查。如果是用malloc來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。如果是用new來申請內存,申請失敗是會拋出異常,所以應該捕捉異常來進行放錯處理。(感謝@melonstreet指出)。
b.內存分配雖然成功,但是尚未初始化就引用它。
解決方法:盡管有時候缺省時會自動初始化,但是無論創建什么對象均要對其進行初始化,即便是賦零值也不可省略,不要嫌麻煩。
c.內存分配成功,但越界訪問。
解決方法:對數組for循環時要把握邊界,否則可能會導致數組越界。
d.忘記了釋放內存,導致內存泄漏。
解決方法:動態內存的申請和釋放必須配對,new-delete和malloc-free且使用次數必須相同。 c.已經釋放內存卻仍然使用它。
有三種情況:
1.程序中對象的關系過于復雜,難以搞清哪個對象是否已經釋放了內存。
2.函數中return寫錯,返回了指向棧中的指針或引用。
3. free或delete后,沒有將指針設為NULL,產生”野指針”。
C++ 內存管理1
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...