記憶體分配筆記 記憶體分配概念和常見錯誤

2021-05-25 22:48:33 字數 1323 閱讀 1637

記憶體分配方式有三種:

(1) ****從靜態儲存區域分配。

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

(2) *****在棧上建立。

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

(3) *****從堆上分配,亦稱動態記憶體分配。

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

code:

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

記憶體分配未成功,卻使用了它。

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

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

犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為記憶體的預設初值全為零,導致引用初值錯誤(例如陣列)。   

記憶體的預設初值究竟是什麼並沒有統一的標準,儘管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式建立陣列,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。   

記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。

例如在使用陣列時經常發生下標「多1」或者「少1」的操作。特別是在for迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。   

忘記了釋放記憶體,造成記憶體洩露。

動態記憶體的申請與釋放必須配對,程式中malloc與free的使用次數一定要相同,否則肯定有錯誤(new/delete同理)。   

釋放了記憶體卻繼續使用它。

有三種情況:   

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

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

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

常見記憶體分配函式

1 kmalloc 核心函式 include void kmalloc size t size,int flags 最大為 128k void kfree void ptr kmalloc分配一塊物理空間和虛擬空間都連續,大小為size的記憶體。常用的flags標誌有 gfp atomic 用來從中...

常見的記憶體分配

動態記憶體分配函式的標頭檔案 1.malloc 函式的使用方法 malloc 函式的返回值是新申請的記憶體空間的首位址,如果申請失敗,返回的是 null 格式如下 void malloc 位元組數 2.calloc 函式的使用方法 calloc 函式的格式 calloc n,size 表示在堆區中申...

常見動態分配記憶體分配函式

1.malloc函式的使用方法 void malloc unsigned size 其中size是指的分配記憶體的位元組 void malloc unsigned size 包含在庫函式 stdlib.h 中,作用是在記憶體的堆區分配乙個大小為size的連續空間,如果分配記憶體成功,函式返回新分配記...