C/C++ 內存管理 (《高質量C++》-- 整理筆記)

  內存管理是咱們在編程時常常遇到的問題,而關於內存管理的問題每每會致使咱們無從下手,這篇隨筆是我閱讀《高質量C++》第7章「內存管理」時一些總結。html

1.內存分配方式編程

在C++中內存分爲5個區,分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。數組

堆:堆是操做系統中的術語,是操做系統所維護的一塊特殊內存,用於程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。函數

棧:在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,可是分配的內存容量有限spa

自由存儲區:自由存儲區是C++基於new操做符的一個抽象概念,凡是經過new操做符進行內存申請,該內存即爲自由存儲區。操作系統

全局/靜態存儲區:這塊內存是在程序編譯的時候就已經分配好的,在程序整個運行期間都存在。例如全局變量,靜態變量。
指針

常量存儲區:這是一塊比較特殊的存儲區,他們裏面存放的是常量(const),不容許修改。htm

Ps:關於new和malloc之間的區別請參考下面這篇博客,裏面完全的講解了這兩者之間的區別和聯繫
對象

http://www.cnblogs.com/QG-whz/p/5140930.htmlblog

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,產生」野指針」。

相關文章
相關標籤/搜索