C 中delete和delete 的區別

2021-06-27 18:09:16 字數 1326 閱讀 2630



1、c++告訴我們在**用 new 分配的單個物件的記憶體空間的時候用 delete,**用 new 分配的一組物件的記憶體空間的時候用 delete。

關於 new 和 delete,其中又分為兩種情況:(1) 為基本資料型別分配和**空間;(2) 為自定義型別分配和**空間。

#include ;

using namespace std;

class t

~t()

};int main()

從執行結果中我們可以看出,delete p1 在**空間的過程中,只有 p1[0] 這個物件呼叫了析構函式,其它物件如 p1[1]、p1[2] 等都沒有呼叫自身的析構函式,這就是問題的癥結所在。如果用 delete,則在**空間之前所有物件都會首先呼叫自己的析構函式。

基本型別的物件沒有析構函式,所以**基本型別組成的陣列空間用 delete 和 delete 都是應該可以的;但是對於類物件陣列,只能用 delete。對於 new 的單個物件,只能用 delete 不能用 delete **空間。

所以乙個簡單的使用原則就是:new 和 delete、new 和 delete 對應使用。

2、事實上new和delete都是兩步操作,分配(釋放)堆記憶體和呼叫構造(析構)函式

對於堆記憶體的釋放,確實不需要做額外的事情,delete和delete 無差別

區別就在於呼叫析構函式這一步,如果用delete只會呼叫第乙個物件的析構,只有呼叫delete才會呼叫全部的析構

也就是說:

delete相當於:

dtor

free

delete相當於:

for(;;) dtor;

free

3、delete會根據申請記憶體的前一些位元組來判斷申請了多少記憶體,然後釋放掉。

用new會根據申請的記憶體數在申請空間前面新增申請的空間數,而new則不會。

如果用delete來刪除new申請的記憶體的話,在vs中會丟擲異常

4、至於要分為乙個和多個這兩種情況

這個問題,c++之父在《c++語言的設計和演化》裡的解釋就是:效率

malloc/free步驟是交給c和系統去做的,系統不區分單個和陣列,你就是想區分也沒用,反正這不是c++的事,所以之父對此沒什麼可折騰的

但是析構多少個元素,系統是不管的,這需要編譯器做,這就需要考量了。析構是c++的特點,c沒有的。之父需要負責的是做同樣的事情時,c++的效率不低於c

毫無疑問,陣列總是要多一些資訊的,如果都把單個理解為size為1的陣列,程式設計師是方便了,但實現效率上是有累贅的

這點累贅值不值得考慮,那就取決於之父的設計原則和時代背景了

C 中delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型別分配和 空間 2 為自...

C 中delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型別分配和 空間 2 為自...

C 中的delete和delete 區別

一直對c 中的delete和delete的區別不甚了解,今天遇到了,上網查了一下,得出了結論。做個備份,以免丟失。c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。關於 new 和 delete,其中又分為兩種...