c 中的動態記憶體管理

2021-07-13 09:11:55 字數 3103 閱讀 1973

c++中的動態記憶體管理問題

c++中使用new和delete實現動態記憶體管理。new和delete實現動態管理物件,new和delete實現動態管理物件陣列。c++中的new和delete運算子均使用我們c中學過的malloc和delete函式實現動態記憶體的開闢。

首先,先簡單介紹下c中的幾個動態記憶體函式malloc,realloc,calloc,free;

void *malloc(size_t size); //動態記憶體開闢函式

void free(void *pointer);  //記憶體釋放函式,向指標傳乙個null不會有任何效果

void *relloc(void *ptr,size_t,new_size);//擴容函式,依然儲存擴容之前的內容(擴大記憶體),若減小記憶體,則記憶體塊尾的空間被拿掉

void *calloc(size_t num_elements,size_t size);//動態記憶體開闢並初始化,返回的指標指向的記憶體的內容被初始化為0

一般在程式出現記憶體錯誤很有可能就是動態記憶體的釋放出問題了,所以在使用動態記憶體時一定要注意釋放的問題,在c中還需要注意在釋放完動態記憶體後將指向動態記憶體的指標置為null,避免形成野指標,好了c中的動態記憶體管理就回憶到這,畢竟我想說的是c++的動態記憶體管理問題。

c++中使用new/delete或new/delete實現動態管理,特別需要提醒的是在動態記憶體的管理中一定要注意new/delete,new/delete,malloc/free一定要注意匹配使用。

我知道大家肯定想既然c++相容c,為什麼不直接使用c中的malloc/free,而要使用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可以自動計算型別的記憶體的位元組數,返回對應型別的指標。

寫個簡單的程式顯示下malloc和new的使用;

首先定義乙個array類:

class array

;下面我們觀察下new和malloc的使用

void test()

通過測試程式,很明顯的看到new和malloc的不同。

其實通過動態開闢的陣列空間使用delete並不一定會出錯,例如:

此時程式並不會出錯,程式沒有崩潰並不代表程式正確,只不過在這次執行沒有崩潰而已,相信大家都看出來了此時delete並沒有將動態開闢的空間全部釋放,只釋放了陣列乙個元素的空間而已,此時發生了很嚴重的記憶體洩漏問題,可能很多人對記憶體洩漏這個問題不是很重視,但這個問題又是卻是致命的,記憶體洩漏並不僅僅只是將系統記憶體耗盡,最重要的問題你當前所執行的程式也可能崩潰,這對乙個程式來說是致命的,但這個問題卻是每乙個程式設計師所苦惱的問題,記憶體洩漏在程式開發中總是如影隨形,解決這個問題就要使用到智慧型指標的知識了,這不是我這篇部落格的重點,咱們現在還是靜下心來研究new/delete吧!!!!

之前說過c++中的new和delete的內部還是依靠malloc/free實現的,在使用我們new時我們除錯進入內部發現,new呼叫了operator new(),delete呼叫了operator delete(),c++ 中還有其他幾個記憶體管理介面,new/delete表示式的實現依靠庫中的這幾個函式。

void * operator new (size_t size);

void operator delete (size_t size);

void * operator new (size_t size);

void operator delete (size_t size);

這幾個函式在內部實現空間的開闢和釋放,他們只負責空間的開闢和釋放,不會呼叫建構函式構造物件也不會呼叫析構函式清理物件。實際上他們只是malloc/free的封裝。

下面我們總結下new/delete,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釋放空間。

特別需要注意的是delete呼叫了n此析構函式,n在哪儲存呢?

實際上new在呼叫operator時多開闢了四個位元組用來存放建立物件的個數。

物件的個數   9

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

物件所需的空間

四個位元組

我們可以使用定位new表示式來模擬實現new的功能,我們先來了解下new表示式:

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

new (place_address) type

new (place_address) type(initializer-list)

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

模擬實現new/delete

class a                 //類中的成員變數存在記憶體對齊

;void test()

new/delete、new/delete在程式中的實現:

文中的的紅色字型均是重點。

本人見識尚欠,若有理解錯誤之處,還望各位大神提出來,鄙人一定虛心學習,認真改正。

本文出自 「qin-wang」 部落格,請務必保留此出處

C 中的動態記憶體管理

相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件不同 malloc free是c c語言的標準庫函式,new delete是c 的運算子,對於非內部資料型別的物件而言,只有malloc free是無法滿足動態物件的要求的。因為物件在建立的時候會自動呼叫建構函式,物件消亡時會自動呼叫析...

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呼叫析構函式清理 釋...