C和Cpp裡面的動態記憶體管理

2021-07-28 08:34:14 字數 1487 閱讀 9100

c語言裡面的動態記憶體管理函式,介紹的有4個,分別是malloc,

realloc,calloc,和free,其函式原型分別如下

void *malloc(size_t size);

void *calloc(size_t num_elements,size_t element_size);

void realloc(void ptr,size_t new_size);

void free(void* pointer);

malloc函式是在堆空間上開闢一塊合適的空間,並且返回乙個指向這塊記憶體的指標,這塊開闢的空間沒有進行任何方式的初始化,如果需要初始化,必須自己手動初始化。

calloc函式也是在堆空間上開闢一塊合適的空間,並且返回乙個指向這塊記憶體的指標,但是,在返回指標之前,這塊空間已經自動初始化為0了。不用自己在初始化,這是malloc 和calloc 最大的區別。

realloc函式是調整開闢的空間的大小,如果空間開闢小了,realloc函式會在開闢的一塊空間,將新開闢的空間新增到原來空間的後面,新空間沒有初始化,當然原來空間內容依然保留,如果空間不夠開闢,realloc將分配另一塊正確大小的空間,並把原來那塊記憶體的內容複製到新的空間裡,並且銷毀原來那塊空間,當然指標指向新的那塊空間,如果空間開闢大了,空間尾部被拿掉,剩餘部分的原先內容依然保留。

free函式是釋放開闢的記憶體,接受的是指向記憶體的指標,

free的時候要注意,

> 同一塊空間不能free兩次,

>free不能只free空間的一部分

>不能不free

> free完,要將指標置空

> malloc和free要成對出現

cpp提供new和delete識別符號(不是函式),來實現動態記憶體管理;

有兩種形式

int *p1 = new int ;

delete p1;

int *p2 = new int[10];

deletep2;

在自定義型別中,例如類中,new辦了兩件事

> 1,開闢堆空間

> 2,呼叫建構函式

當然delete也辦了兩件事,

> 呼叫析構函式

> **堆空間

內建型別中,new delete和malloc 和free 是一樣的

當然cpp中也提供了庫函式operator new()和opreator delete()

來管理記憶體。

只不過這兩者是new和delete的底層**,使用new的時候會呼叫operator new,operator new會呼叫operator new,operator會呼叫malloc,而delete會呼叫opreator delete ,operator 會呼叫free,最後還是回到了 malloc 和free上面,

因此,只要你理解了這層關係,你可以不用匹配寫new和delete ,但是對於初學者來說,一定要匹配寫,否則很容易弄錯。

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...

c 動態記憶體管理

c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...