記憶體的動態管理

2021-08-20 07:54:25 字數 2657 閱讀 7007

首先:我們之前所掌握的記憶體開闢方式特點:

1.空間開闢大小是固定的。

2.陣列在申明時,必須指定陣列的長度,它所需要的內存在編譯時分配。

但是由於我們有時候需要的空間大小是在程式執行時才能知道,那我們就可以試試用動態記憶體。

一、malloc和free

這兩個宣告的標頭檔案都是stdlib.h

原型:void *malloc (size_t size)

這裡的size>0  ,以位元組申請。

此時我們就申請的一塊連續可用的空間,並返回指向這塊空間的指標。

1->若開闢成功,則返回開闢好的空間指標。

2->

若開闢失敗,則返回null。

因此malloc的返回值一定要做檢查。

3->

返回值型別為void*,所以malloc函式由使用者自己決定。

原型:void free (void *ptr)

功能:用來釋放動態開闢的記憶體。

在這裡我們說一下記憶體洩漏

若我們不去free我們自己申請的記憶體,那麼就會發生記憶體洩漏的問題,但是記憶體洩漏會隨著程序的退出而結束。可是有一種叫做常駐程序(在作業系統中不停止的程序)會發生,因此我們一定牢記在用完申請的記憶體之後一定要記著free.

對於free我在說幾點:

1->它並不會釋放此空間,而是斷開指標與目標快取區的聯絡。

2->我們建議以大塊的記憶體空間進行申請。

3->實際申請的記憶體空間會比我們期望的大。

4->free完此指標被我們稱為「懸垂指標」,要將該指標設定為null.

二、calloc

原型:void *calloc(size_t num,size_t size)

功能:為num個大小為size的元素開闢一塊空間,並把每個空間的每個位元組初始化為0.

三、realloc

原型:

void* realloc (void* ptr,size_t size)

功能:靈活的調整型別

1.ptr是要調整的記憶體位址

2.size調整之後新大小

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

4.調整原記憶體空間大的大小的基礎,還會將原來記憶體中的資料移動到新的空間。

realloc在這裡有兩種情況:

1->原有的空間之後有足夠大的空間  方法:直接在之後追加,原空間的資料不發生變化

2->原有的空間之後沒有足夠大的空間  方法:在堆空間另找乙個適合的大小的連續空間來使用,這是函式返回值是乙個新的記憶體位址。

我們來看這樣乙個**

int *ptr = malloc(100);

if (ptr != null)

else

//**1

ptr = realloc(ptr, 1000);

p=null;free(ptr);

弊端:假如我們記憶體申請失敗,那麼將會返回null,也會將之間申請的空間也將找不到,會發生記憶體洩漏。那麼我們進行改進:

//**2

int *p = null;

p = realloc(ptr, 1000);

if (p != null)

p=null;free(ptr);

常見的記憶體錯誤做乙個文字總結

解引用操作:

1.需要判空      2.不可越界訪問

對非動態開闢記憶體使用free釋放:

1.只能釋放堆上的空間。

使用free釋放一塊動態記憶體的一部分:

1.free必須整體free   

同一塊動態記憶體多次釋放。

1.不可重複,第一次釋放已經為野指標,第二次無法進行訪問。

四、柔性陣列

概念:結構體中的最後乙個元素允許是位置大小的陣列(在結構體內部可以有乙個變長的陣列)

typedef struct st_type

type_a;

特點:

1. 至少有兩個成員。

2. sizeof返回的這種結構大小不包括柔性陣列記憶體。

3.包含柔性陣列成員的結構用malloc()函式進行記憶體的動態分配。

使用:

type_a *p = (type*)malloc(sizeod(type_a) + 100 * sizeof(int));

int i;

p->i = 100;

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

free(p);

此時這個陣列就獲得了100個整形元素的連續空間。

記憶體動態管理

記憶體動態管理 主要是指對 堆 記憶體或者自由記憶體的管理和使用 在c語言中使用malloc 和free 動態分配和釋放儲存單元。malloc 以空間大小作為引數,不知道資料具體型別,因此分配空間後範圍的位址指標void 無法指向具體的資料,必須進行強制轉換後才可以指向具體型別資料。c 提供了使用簡...

動態記憶體管理

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

動態 記憶體管理

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