解析c 動態記憶體管理

2021-08-04 02:04:16 字數 3284 閱讀 6227

在說今天的主題前我們先來回顧 c語言中的動態記憶體管理。

在c語言,使用的是malloc/calloc/realloc/free在堆上動態的開闢或修改一塊連續的空間。我們先來回顧一下這些函式的區別。

(1)malloc:void *malloc( size_t size );

malloc函式在使用時,只需要傳遞乙個引數size,那就是將要分配記憶體的大小,一般需用sizeof(type)*num手動計算。有時malloc所申請的空間可能會比實際所申請的空間要大,要用來存放維護資訊等。

(2)calloc: void *calloc( size_t num, size_t size );

calloc與malloc都是在堆上申請一塊連續的空間,不過calloc申請的空間都已初始化,並且需要傳遞兩個引數,所以,calloc是在堆上申請num個大小為size的連續空間。

(3)realloc: void *realloc( void *memblock, size_tsize);

memblock函式有兩個引數,memblock是所要修改空間的位址,size是重新申請的位址長度。

如果memblock不為null,則會對已分配好的記憶體進行修改,如果所要修改的記憶體過大,realloc會重新申請一塊空間,並將內容完全複製過來,返回新空間的首位址,並將原有空間進行銷毀。

如果memblock為null,則分配行為與malloc相同。

了解了上述內容,我們來看看關於c++的動態記憶體管理是怎麼回事呢?

c++是通過new和delete操作符實現的。

new/delete動態管理物件。

new/delete動態管理物件陣列。

特別注意new和delete它不是函式,而是操作符!

那麼接下來我們來看看具體的例項吧

void test ()

特別注意:new/delete,new/delete一定要匹配使用!!!

接著我們先來看一段**

#include 

using

namespace

std;

class p1

~p1()

void display()

private:

int _a;

};int main()

**執行成功後的結果如圖所示:

這就說明了new在建立乙個類時,會預設呼叫建構函式使類初始化。

而我們的delete是先呼叫析構函式,然後在進行釋放。

在動態記憶體管理中

new做了兩件事:

1.呼叫operator new分配空間。

2.呼叫建構函式初始化物件。

delete也做了兩件事:

1.呼叫析構函式清理物件

2.呼叫operator delete釋放空間

new[n]做了兩件事:

1.呼叫operator new分配空間。

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

delete也做了兩件事:

1.呼叫n次析構函式清理物件。

2.呼叫operator delete釋放空間。

總結:

1.operator new/operator delete ,operator new/operator delete 和 malloc/free用法一樣。

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

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

知道了c++的動態記憶體的基本實現方法,我們來看看malloc/free與new/delete的有什麼區別與聯絡?

(1). 它們都是動態管理記憶體的介面。

(2). malloc/free是c/c++標準庫的函式,new/delete是c++操作符。

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

(4). malloc/free需要手動計算型別並且返回值是void*,new/delete可以自己計算型別的大小,並返回對應型別的指標。

(5).malloc失敗會返回0,new失敗會丟擲異常。

接下來我們來看看定位new表示式

定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件,用法如下

new (place_address) type

new (place_address) type(initializer-list)

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

接著我們來看它的具體實現吧:

#include 

#include

using

namespace

std;

class aa

~aa()

void display()

private:

int _a;

};int main()

**執行成功後的結果是:

由_a的輸出結果是0我們可以知道定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。

接著我們來通過定位new表示式來模擬實現new和delete

#include 

#include

using

namespace

std;

class aa

~aa()

void display()

private:

int _a;

};#define new_array(ptr,type,n)\

do \

\} while (false);

#define delete_array(ptr,type) \

dowhile (false);

int main()

**執行成功後的結果如圖:

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 用...