c 動態記憶體管理

2021-08-03 23:29:07 字數 3486 閱讀 8842

**c語言動態記憶體管理**
c中關於動態記憶體的標準庫函式:malloc() ,calloc() ,realloc(),free()

以下是關於這幾個函式的介紹:

1、malloc(),用於動態開闢記憶體(堆空間),返回型別為void *,引數(size_t size)是無符號整型表示要開闢的空間大小,單位是位元組,

2、calloc(),用於動態開闢記憶體(堆空間),返回型別為void *,引數有

(size_t num, size_t size ),表示開闢num個大小為size的空間,

3、realloc(),用於修改已經分配好的記憶體塊的大小,返回型別為void ,引數(void memblock, size_t size),memblock是指向記憶體塊的指標,size表示要開闢的空間大小;如果是擴大乙個記憶體塊,並且記憶體塊能滿足要開闢的大小,則記憶體塊中原來的內容保持不變,新新增的記憶體新增在原來記憶體塊的後面,若不能滿足,則需重新開闢一塊空間,並將原來的內容拷貝到新記憶體中,詳見下圖:

若是縮小乙個記憶體塊,該記憶體塊尾部部分記憶體會被釋放,剩餘部分不變,如果memblock是空指標時,則和malloc()函式功能一樣;

malloc()和calloc()都用於開闢記憶體,那它們有何區別?

malloc()開闢空間後,未將其內容進行初始化,內容為隨機值;

calloc()開闢空間後,並將其內容初始化為0;

4、free(),用於釋放記憶體空間,返回型別為void ,引數( void* memblock)memblock是指向記憶體的指標;

*注意:這四個函式必須搭配使用,即用malloc()、realloc()、calloc()時必須使用free(),這樣可以避免記憶體洩漏甚至崩潰的問題。*

**c++動態記憶體管理**
c++動態記憶體管理的實現,是使用new,delect操作符來實現的:

例如:int *p1=new (int)//表示開闢乙個整型的空間,在堆上開闢;

int *p2=new[10] (int)//表示開闢10個整型的空間;

delete p1;

deletep2;

注意:new與delect\new與delete需搭配使用;

malloc/free和new/delete的區別和聯絡?

它們都是動態管理記憶體的⼊口;

malloc/free是c/c++標準庫的函式,new/delete是c++操作符;

malloc/free只是動態分配記憶體空間/釋放空間。⽽new/delete除了分配空間還會調⽤建構函式和析構函式進⾏初始化與清理(清理成員)。

malloc/free需要⼿動計算型別⼤⼩且返回值會void*,new/delete可⾃⼰計算型別的⼤⼩,返回對應型別的指標。

由此可以看出c++中的new、delete更加的高效,更適用與c++,在例項化過程中更加適用;

new、delete的實現:

可以看到new的底層實現是通過 operator new()函式實現的;函式內部呼叫了malloc()函式開闢空間;即opertaor new()是對malloc的封裝;

通過除錯可以看出delete在實現時呼叫了operator delect(),它是對free()函式的封裝;

總結:

1. operator new/operator delete operator new/operator delete 和 malloc/free⽤法⼀樣。

2 它們只負責分配空間/釋放空間,不會調⽤物件建構函式/析構函式來初始化/清理物件。

3.實際operator new和operator delete只是malloc和free的⼀層封裝。

注意:operator new(),operator delete(),不是運算子的過載,它們是c++中的標準庫函式。

new的功能有:

1. 調⽤operator new分配空間。

2. 調⽤建構函式初始化物件。

delete的功能:

1. 調⽤析構函式清理物件

2. 調⽤operator delete釋放空間

new[n]的功能:

1. 調⽤operator new分配空間。

2. 調⽤n次建構函式分別初始化每個物件。

delete的功能:

1. 調⽤n次析構函式清理物件。

2. 調⽤operator delete釋放空間。

通常用delete時沒有給出次數,那編譯器是如何知道,要呼叫析構函式的次數呢?

#define _crt_secure_no_warnings 1

#include

#include

using

namespace

std;

class a

~a()

void display()

;int main()

除錯後發現:

可以發現:operator(size_t cd),cd=16,即建立了16個位元組的空間;

但開闢 3個a類物件只需12個位元組,那為何會多出4 個位元組呢?

經測試:

由此可知,多出來的4個位元組是用來存放要開闢的物件個數的;

注意:只有當為非內建型別(類的物件等)開闢空間,並且該類有自定義的析構函式時,才會有多出的4個位元組!

以上對new和delete的說明,可以模擬實現new的功能,在實現之前先介紹,定位new表示式;

定位new表示式:是在已分配的原始記憶體空間中調⽤建構函式初始化⼀個物件。

用法如下:

new (place_address) type

new (place_address) type(initializer-list)

place_address必須是⼀個指標,initializer-list是型別的初始化列表。

模擬實現new操作符,**如下:

#define  new(p,count,type)\

\

}

模擬實現delete:

delect(p)

free((int *)p-1);

}

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進行動態記憶體管理 malloc是不初始化的開闢空間,其引數為空間的大小,單位為位元組 calloc是初始化的進行開闢空間,其引數為 元素個數,大小 單位為位元組。realloc增容,如果後面的空間足夠的話,就直接追...