C 記憶體分配方式與錯誤處理方式

2021-10-05 17:36:56 字數 1015 閱讀 6951

c++記憶體分配方式有三種:

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

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

(3)  從堆上分配,亦稱動態記憶體分配。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

發生記憶體錯誤是件非常麻煩的事情。編譯器不能自動發現這些錯誤,通常是在程式執行時才能捕捉到。而這些錯誤大多沒有明顯的症狀,時隱時現,增加了改錯的難度。有時使用者怒氣沖沖地把你找來,程式卻沒有發生任何問題,你一走,錯誤又發作了。

常見的記憶體錯誤及其對策如下:

程式設計新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,在使用記憶體之前檢查指標是否為 null。如果指標 p 是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查。如果是用 malloc或 new來申請記憶體,應該用 if(p==null) 或

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

犯這種錯誤主要有兩個起因:一是沒有初零,導致引用初值錯誤(例如陣列),記憶體的預設初值究竟是什麼並沒有統一的標準,儘管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式建立陣列,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。

(1)程式中的物件呼叫關係過於複雜,實在難以搞清楚某個物件究竟是否已經釋放記憶體,此時應該重新設計資料結構,從根本上解決物件管理的混亂局面。

(2)函式的 return 語句寫錯了,注意不要返回指向「棧記憶體」的「指標」或者「引用」,因為該內存在函式體結束時被自動銷毀。

(3)使用 free 或 delete 釋放了記憶體後,沒有將指標設定為 null。導致產生「野指標」。用 free 或 delete 釋放了記憶體之後,立即將指標設定為 null,防止產生「野指標」。

C記憶體分配方式與C 記憶體分配方式

c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...

C 錯誤處理方式的思考

前言 介紹了異常機制在專案中的應用,同時介紹了scopeexit和用無限展開巨集技術寫的乙個errert 知乎上中對異常的討論 一.錯誤處理要思考的四個問題 1.錯誤的定義,即什麼是錯誤 2.如何報告錯誤?error code機制還是異常機制?3.何時,如何處理錯誤 二.什麼是錯誤 錯誤即是當程式執...

C 記憶體分配方式

在c 中,記憶體分成5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。和堆一樣,使用者棧在程...