動態記憶體管理

2021-08-20 14:39:23 字數 1921 閱讀 8500

一、開闢動態記憶體的原因

平時我們定義的變數、陣列等都在棧上開闢空間,這裡的侷限性是,空間開闢大小固定,尤其陣列還要指定長度,所需內存在編譯時分配;但是,有時候我們需要的空間大小在程式執行時才能知道,因此我們需要動態記憶體開闢。

二、動態記憶體管理函式

malloc(動態記憶體開闢函式)

1、向記憶體申請一塊連續可用的空間,按位元組分配,且分配的記憶體空間不初始化,返回指向這塊空間的指標。

2、返回型別為void*.

3、函式只有乙個引數

4、函式原型:void* malloc(size_t size);//size是位元組個數

注意事項:

(1)若開闢成功,返回乙個指向開闢好空間的指標。

(2)若開闢失敗,返回乙個null指標,所以一定要檢查函式的返回值。

(3)返回值型別是乙個void*的指標,所以說malloc函式並不知道開闢空間的型別,這個由使用者自己來決定。

(4)開闢引數大小如果為0,malloc行為未定義,取決於編譯器。

free(動態記憶體的釋放與**函式)

1、函式原型:void* free(void* ptr)

注意事項:

(1)如果引數ptr指向的空間不是動態開闢的,那麼free函式的行為也是未定義的。

(2)如果引數ptr是null,則函式什麼都不做。

(3)開闢的記憶體空間只能整塊釋放,不可部分釋放。即釋放的指標與開闢空間返回的指標必須相同。

calloc(動態記憶體分配函式)

1、按位元組分配記憶體空間,分配的記憶體空間進行初始化為0

2、返回型別為void*

3、函式有二個引數,按型別位元組大小和個數開闢記憶體空間

4、函式原型:void* malloc(size_t count,size_t size);//count是個數,size是型別大小

注意事項:

(1)它與malloc函式區別在於:calloc函式會將記憶體初始化為0,引數不一樣。

realloc(記憶體調整函式)

1、動態按位元組調整記憶體大小

2、返回原型別void*  void* realloc(void* ptr,size_t newsize);//ptr所要開闢記憶體的指標,newsize開闢的位元組數

3、函式有二個引數,調整記憶體空間的指標和所要調整的大小

4、當原指標為空時,同於malloc開闢記憶體空間

5、當原指標不為空時,

(1)指標處有足夠的的記憶體空間,則直接進行擴容,增大記憶體空間,原指標位址不變

(2)指標處無足夠的記憶體空間,則重新尋找一塊足夠的記憶體空間,並把資料拷到新空間中,釋放就舊空間,返回新空間位址。原指標位址發生改變

(3)無足夠記憶體空間返回null,資料據丟失。所以建議不要使用原指標接收返回的位址,而用臨時指標接收返回的位址,空間開闢成空(非null),再指向臨時指標,

防止資料丟失

注意事項:

(1)如果原有的記憶體空間之後又足夠大的空間,那麼直接擴充套件大小,原資料保留。

(2)如果原記憶體空間之後沒有足夠大空間供我們調整,那麼在堆空間上另找乙個合適大小的連續空間,並且將原資料拷過去,並且返回這塊新位址。

注:不管使用那種方式管理記憶體空間,都需對返回值進行判斷,判斷空間是否開闢成功,成功返回非null,失敗返回null;

釋放記憶體空間---->free()

三、常見的動態記憶體錯誤

1.     對null指標解引用

2.     對動態開闢的空間越界訪問

3.     對不是動態開闢的記憶體使用free來釋放

4.     使用free釋放一塊動態開闢記憶體的一部分

5.     對同一塊記憶體多次釋放

6.     動態開闢的記憶體忘記釋放(導致記憶體洩漏)

動態記憶體管理

首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...

動態記憶體管理

c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...