c 動態記憶體管理相關知識

2021-08-03 22:55:44 字數 3118 閱讀 4921

1.c語言動態記憶體管理

c語言使用

malloc

、calloc

、realloc

、free

進行動態記憶體管理

void test()

(1)malloc函式在記憶體的動態儲存區中分配一塊長度為

size

位元組的連續區域,返回該區域的位址,不初始化。

(2)calloc函式與

malloc

函式相似,不同的是

calloc

會將所分配的空間中的每一位都初始化為零。

(3)realloc函式會首先判斷

oldbase

後是否有足夠要求的新空間,若有,則擴大

oldbase

指向的位址空間;若沒有,就重新另外分配一塊位址空間,並將原有的資料拷貝到新的空間,然後釋放原有的記憶體空間,同時返回新分配的記憶體空間首位址。

malloc、

calloc

、realloc

必須和free

匹配使用,否則可能出現記憶體洩露甚至崩潰的問題。

2.c++是相容

c的,而

c語言庫中已經有

malloc/free

等管理動態記憶體,為什麼

c++還要定義

new/delete

運算子來管理動態記憶體呢?

malloc/free和

new/delete

的區別與聯絡

(1)它們都是動態管理記憶體的入口;

(2)malloc/free是

c/c++

庫中函式,new/delete是

c++中的操作符;

(3)malloc/free只是動態分配記憶體空間

/釋放空間,而

new/delete不僅分配空間還呼叫建構函式和析構函式進行初始化和清理(清理成員);

(4)malloc/free需要手動計算型別大小且返回值為

void*

,new/delete

可自動計算型別大小且返回的是對應型別的指標。

因此引入c++動態記憶體管理

new/delete

操作符。

3.c++動態記憶體管理基本語法和使用

new/delete動態管理物件

new/delete動態管理物件陣列

void test()

new/delete和

new/delete

必須匹配使用,否則可能出現記憶體洩露甚至崩潰的問題。

(1)new/operator底層實現

#include

//#include

using namespace std;

class array

}~array()

}private:

int* _a;

size_t _size;

};void test()

int main()

除錯轉到反彙編可以看到,new呼叫了operator new開闢空間

然後呼叫建構函式初始化

delete、delete呼叫析構函式清理物件,然後呼叫operator delete、operator delete釋放空間。

(2)void* operator new (size_t size);

void operator new (void* p);

void* operator new (size_t size);

void operator new (void* p);

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

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

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

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

(3)new[n]

*.呼叫operator new分配空間;

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

delete

*.呼叫n次析構函式清理物件;(思考n是如何而來?)

*.呼叫operator delete釋放空間。

根據以上**中的

得這兩條語句實際是呼叫operator new(10*sizeof(array)+4)分配大小為10*sizeof(array)+4空間,其中多的四個位元組空間用於存放delete中呼叫析構函式的次數,空間申請好後呼叫建構函式建立物件。

delete p4執行時首先取n個物件個數,然後呼叫析構函式析構物件,最後用operator delete函式釋放空間。

總結:

new在開闢內建型別空間時,開闢的空間數量是指定的空間數量,位元組數是指定的數量乘以型別的大小;當為非內建型別開闢空間,並且該類有自定義的析構函式時,才會多出4個位元組。

(4)定位new表示式

在已分配的原始記憶體空間中的特定位置處呼叫建構函式初始化乙個物件。

模擬實現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 用...