C C 程式設計之記憶體管理

2021-09-24 22:45:45 字數 1827 閱讀 7949

記憶體分配方式

c語言中記憶體分配方式

(1)從(全域性)靜態儲存區域分配;

內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。

(2)常量儲存區;

儲存程式中的常量。

(3)棧區;

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

(4)在堆上分配,亦稱動態記憶體分配;

程式在執行的時候用malloc或者new申請任意多少的記憶體,程式設計師自己負責在何時用free或者delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但是問題也多。

(5)**區;

存放二進位制**。

c++中記憶體分配方式

(1)棧區;

棧區空間就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。儲存變數通常是區域性變數、函式引數等。

(2)堆區;

堆記憶體就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

(3)自由儲存區;

儲存那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

(4)全域性/靜態儲存區;

全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

(5)常量儲存區;

這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)。

記憶體釋放問題

(1)靜態儲存區域以及建立的棧,在函式執行完以後,出棧銷毀,這個過程會釋放靜態分配的記憶體,不需要程式設計師手動操作;

(2)而動態分配的記憶體,實際是在堆上,系統沒法自動釋放堆上的記憶體,需要程式設計師手動寫free或者delete函式來告訴系統需要釋放堆上哪個位置的記憶體;

常見的記憶體錯誤及對策

(1)記憶體尚未分配成功,卻使用了它;

解決辦法:在使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口使用assert(p != null) 進行檢查,如果是用malloc或者new來申請的,應該用

if (p == null)或者 if (p != null) 來進行防錯處理。

(2)記憶體分配雖然成功,但是尚未初始化就引用它;

錯誤原因:一是沒有初始化的觀念,二是誤以為記憶體的預設初值全為零,導致引用初值錯誤(如陣列)。

解決辦法:記憶體的預設初值是什麼並沒有統一的標準,儘管有些時候為零值,但是寧可信其有,不可信其無,無論以何種方式建立陣列,都要賦初值。

(3)記憶體分配成功並初始化,但是超過了記憶體的邊界;

這種問題常出現在陣列越界,寫程式是要仔細。

(4)忘記釋放記憶體,造成記憶體洩露;

含有這種錯誤的函式每次被呼叫都會丟失一塊記憶體,開始時記憶體充足,看不到錯誤,但終有一次程式死掉,報告記憶體耗盡。

記憶體管理需要遵循的規則

(1)用malloc 或者 new 申請記憶體之後,應該立即檢查指標值是否為 null ,防止使用指標值為null的記憶體;

(2)不要忘記陣列和動態記憶體賦初值,防止未被初始化的記憶體作為右值使用;

(3)避免陣列或者指標下標越界,特別要當心「多1」或者「少1」的操作;

(4)動態記憶體的申請與釋放必須配對,防止記憶體洩露;

(5)用free或者delete釋放了記憶體之後,立即將指標設定為null,防止產生「野指標」;

注意了以上問題,在記憶體管理方面,我想應該不會出現bug了吧,呵呵。

C C 程式設計之記憶體管理

1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...

C 程式設計之記憶體管理(再談)

在 常見的記憶體錯誤及其對策 c 中,記憶體分成 5 個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來說,釋放工作由程式設計師控制,容易產生 memory leak。空間大小 一般來講在 32 位系統下,堆記憶體...

閒談程式設計之 記憶體

記憶體是對一堆電晶體的連續抽象 別告訴我你不知道電晶體,也別說你不知道他的工作原理,否則請看 每8個電晶體組成乙個位元組,每個位元組都有自己的位址,這個位址就是傳說中的記憶體位址,如果你在c中寫下如下的表示式 以下在未經特殊說明的情況下,均為c語言環境 a 0 a是乙個符號,它有自己的真實位址,如果...