動態記憶體開闢

2021-08-25 02:49:29 字數 2511 閱讀 4697

1.記憶體分配方式(三種)

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

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

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

2.動態記憶體函式

malloc和free

c語言提供了乙個動態記憶體開闢函式:void *malloc(size_t size);c語言還提供了另外乙個函式free,專門是用來動態記憶體的釋放和**的,函式原型:void free(void *ptr);例:

//malloc 和 free 都宣告在 stdio.h 標頭檔案中

#include

int main()

free(ptr);//釋放ptr所指向的動態記憶體

ptr = null;//這是非常有必要的一步

return

0;}

calloc

c語言還提供了乙個函式叫calloc,也用來動態記憶體分配,原型:void *calloc(size_t num, size_t size);例:

malloc函式來完成任務。

realloc

例:

#include 

int main()

else

//擴充套件容量

int *p = null;

p = realloc(ptr, 1000);

if (p != null)

free(ptr);

return

0;}

3.常見的記憶體錯誤及其對策發生記憶體錯誤是件非常麻煩的事情,編譯器不能自動發現這些錯誤,通常是在程式執行時才能捕捉到,而這些錯誤大多沒有明顯的症狀,時隱時現,增加了改錯的難度。

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

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

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

(3)記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。例如在使用陣列時經常發生下標「多 1」或者「少 1」的操作,特別是在 for 迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。

void test()

for (i = 0; i <= 10; i++)

freep(p);

}

void test()

}int main()

(5)釋放了記憶體卻繼續使用它,有三種情況:

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

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

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

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如全域性變數,static變數 2.從棧空間分配,函式呼叫完其被自動釋放 3.從堆空間分配,即動態記憶體開闢,比如 malloc,calloc,realloc,何時申請何時釋放 malloc 函式原型void malloc s...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數 2.從棧空間分配,函式呼叫完成後被自動釋放 3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc malloc calloc realloc和free mallo...

動態記憶體開闢

動態記憶體開闢的函式有malloc realloc calloc free函式,接下來對每乙個函式進行解釋及使用,並總結出幾個經典的例子鞏固,以及總結常見的錯誤。1.malloc free基本使用 int main free p p null return 0 2.realloc free基本使用 ...