動態記憶體管理

2021-09-12 08:42:08 字數 2186 閱讀 1159

malloc的用法:(動態記憶體的分配)

void* malloc(size_t size);

void*表示未確定的型別的指標,可以指向任何型別的資料;因此必要的時候要對型別進行轉換,其中size代表的是位元組而不是大小;如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。

這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。

如果開闢成功,則返回乙個指向開闢好空間的指標。

如果開闢失敗,則返回乙個null指標,因此 malloc 的返回值一定要做檢查。

if

(null

!= ptr)

//判斷ptr指標是否為空

free

(ptr);

malloc 需要和 free 搭配使用,表示釋放掉這塊記憶體,否則會造成記憶體洩露;

注意:free 只能釋放由 malloc 申請的動態記憶體

calloc 函式也用來動態記憶體分配。原型如下:

void* calloc (size_t num, size_t size);
函式的功能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0;與函式 malloc 的區別只在於: calloc 會在返回位址之前把申請的空間的每個位元組初始化為全 0

realloc函式:

可以自由調節已經申請的記憶體空間大小(記憶體不夠用)

void* realloc (void* ptr, size_t size);
ptr 是要調整的記憶體位址;size 調整之後新大小

返回值為調整之後的記憶體起始位置。

注意:當realloc調整之後,原有之後又足夠大的空間;要擴充套件記憶體就直接原有記憶體之後直接追加空間,原來空間的資料不發生變化;但是如果原有空間不夠用的話,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來使用。這樣函式返回的是乙個新的記憶體位址,所以就要進行指標是否有效;

int

*p =

null

; p =

realloc

(ptr,

1000);

if(p !=

null

)free

(ptr)

;

以下**是一些常見的錯誤,值得注意:

//1.申請的記憶體不進行判別

int *p = (int *)malloc(int_max/4);

*p = 20;

free(p);

如果p的值是null,free ( p )是未定義的,就會有問題;而且如果對乙個空指標進行解引用也會出錯;

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

void

test()

for(i =

0; i <=

10; i++

)free

(p);

}

我們只申請了10*sizeof(int)的位元組,所以只能容納十個數字

//3.對非動態開闢記憶體使用free釋放

int a =10;

int*p =

&a;free

(p);

指標p不是動態記憶體申請的,所以會出現未定義的行為;

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

int

*p =

(int*)

malloc

(100);

p++;free

(p);

p不再指向動態記憶體的起始位置,已經發生改變;

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

int

*p =

(int*)

malloc

(100);

free

(p);

free

(p);

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

void

test()

}int

main()

忘記釋放不再使用的動態開闢的空間會造成記憶體洩漏

切記: 動態開闢的空間一定要釋放,並且正確釋放

動態記憶體管理

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

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,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...