C C 動態記憶體管理

2021-08-15 22:06:44 字數 2632 閱讀 6643

棧區:自動存放變數。在執行函式時,編譯器會將函式的引數,區域性變數自動存放在棧內,函式呼叫結束時會自動**空間,棧記憶體分配效率高但容量有限。

棧是又高位址向低位址生長,向下生長的。

堆區:在執行時呼叫程式來分配記憶體(malloc/new),由程式設計師自己決定分配記憶體的大小,同時需要程式設計師自行釋放分配的空間(free/delete)。

資料段:內存在程式啟動的時候才被分配,而且可能直到程式開始執行的時候才被初始化,如函式中的靜態變數就是在程式第一次執行到定義該變數的**時才被初始化。所分配的內存在程式的整個執行期間都存在,如全域性變數,static變數等。

**段:存放常量,不允許被修改。

c語言使用malloc/calloc/realloc/free進行動態記憶體管理。

1、malloc:在記憶體中開闢一塊指定大小連續的空間,將空間首位址給指標變數

(1)函式宣告:extern void *malloc(unsigned int num_bytes);

(2)函式的使用

#include#includeint main(void)

return 0;

}

說明:傳參部分為所需要申請的記憶體空間的大小。

返回值為void* ,因此需要強制型別轉換為需要的型別。

p是:在棧記憶體中存放了乙個指向一塊堆記憶體大小為100位元組的指標。

如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

2、calloc:

在記憶體的動態儲存區中分配n個長度為size的連續空間

(1)函式宣告:extern void*calloc(size_t n,size_t size); 

(2)函式的使用

#includeint main(void)

return 0;

}

說明:與malloc相似。

3、realloc:用於修改乙個原先已經分配記憶體塊的大小,可以擴大也可以縮小。

(1)函式宣告:void *realloc(void *mem_address, unsigned int newsize); 

(2)函式的使用

#include#includeint main(void)

return 0;

}

說明:擴大記憶體時:先判斷當前的指標是否有足夠的連續空間,如果有,擴大p指向的位址,並且將返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域(注意:原來指標是自動釋放,不需要使用(free),同時返回新分配的記憶體區域的首位址)。

若縮小時:該記憶體塊尾部的部分記憶體釋放,其餘部分保留。

4、free:

釋放ptr指向的儲存空間。被釋放的空間通常被送入可用儲存區池,以後可在呼叫malloc、realloc以及          calloc函式來再分配。

函式宣告: void free(void *ptr) 

c++通過new和delete動態管理記憶體。

new/delete動態管理物件。

new/delete動態管理物件陣列。

1、new/delete

new運算子返回的是乙個指向所分配型別變數(物件)的指標。對所建立的變數或物件都是通過該指標來間接操作的,動態建立的物件本身沒有名字。

注意:釋放陣列空間時delete後面的 是很重要的,如果少了 ,則編譯器會認為該指標是指向陣列第乙個元素的,會產生**不徹底的問題(只**了第乙個元素所佔的空間),加了 後就轉化為指向陣列的指標,**整個陣列。delete 中不需要填寫陣列元素的個數,編譯器自知,即使填了,編譯器也會忽略。

例:

int main(void)

2、new/delete 的深度解剖

簡單用圖表示:

注意:

new:完成兩件事,先底層呼叫malloc分了配記憶體,然後建立乙個物件(呼叫建構函式)。

delete:也完成兩件事,先呼叫析構函式(清理資源),然後底層呼叫free釋放空間。

c++動態記憶體管理

C C 動態記憶體管理

一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...

C C 動態記憶體管理

注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...

C C 動態記憶體管理

c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...