內存管理

作者:yangqi916

鏈接:http://www.lxweimin.com/p/cdfde318d5ee

來源:簡書

1.內存分配方式

在C++中內存分為5個區(qū),分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。

堆:堆用于程序的內存動態(tài)分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。

棧:在執(zhí)行函數(shù)時,函數(shù)內局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。

自由存儲區(qū):自由存儲區(qū)是C++基于new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即為自由存儲區(qū)。

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

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


malloc與new的區(qū)別

http://www.lxweimin.com/writer#/notebooks/14660241/notes/17058500


常見的內存錯誤及解決方法

a.內存分配未成功,卻使用了它。

解決方法:在使用內存之前檢查指針是否為NULL。如果指針p是函數(shù)的參數(shù),那么在函數(shù)的入口處用assert(p!=NULL)進行檢查。如果是用malloc來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。如果是用new來申請內存,申請失敗是會拋出異常,所以應該捕捉異常來進行放錯處理。

b.內存分配雖然成功,但是尚未初始化就引用它。

解決方法:盡管有時候缺省時會自動初始化,但是無論創(chuàng)建什么對象均要對其進行初始化,即便是賦零值也不可省略,不要嫌麻煩。

c.內存分配成功,但越界訪問。

解決方法:對數(shù)組for循環(huán)時要把握邊界,否則可能會導致數(shù)組越界。

d.忘記了釋放內存,導致內存泄漏。

解決方法:動態(tài)內存的申請和釋放必須配對,new-delete和malloc-free且使用次數(shù)必須相同

e.已經釋放內存卻仍然使用它。

有三種情況:

1.程序中對象的關系過于復雜,難以搞清哪個對象是否已經釋放了內存。

2.函數(shù)中return寫錯,返回了指向棧中的指針或引用。

3. free或delete后,沒有將指針設為NULL,產生”野指針”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、內存分配方式內存分配方式有三種:代碼區(qū)/文本區(qū) 只讀并具有可執(zhí)行權限 從靜態(tài)存儲區(qū)域分配。內存在程序編譯的時...
    Albert_Sun閱讀 321評論 1 0
  • 前言 C語言作為一門應用途廣泛、功能強大、使用靈活的面向過程式編程語言。既可用于編寫應用軟件,又能用于編寫系統(tǒng)軟件...
    老板娘來盤一血閱讀 13,034評論 32 83
  • 謹記 人生有兩條路,一天需要用心走,叫做夢想;一條需要用腳走,叫做現(xiàn)實。心走的太快,會迷路的;腳走的太快,會摔倒的...
    長風留言閱讀 5,948評論 7 16
  • 內存分配方式 在C++中,內存分成5個區(qū),他們分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。 在棧上創(chuàng)建...
    showaichuan閱讀 328評論 0 2
  • 嵌入式系統(tǒng)的內存管理 姓名:張猛 引用自:http://blog.csdn.net/baskmmu/article...
    oliverabc閱讀 2,114評論 0 0