c 重新了解delete

2021-09-13 10:11:39 字數 2769 閱讀 8990

大家都知道new了乙個變數,需要使用delete釋放記憶體,而new出了乙個陣列,需要使用對應的delete釋放記憶體。但我好像在哪看見過一種說法:針對系統內建型別,使用new分配後的不管是陣列還是非陣列形式記憶體空間用deletedelete都可以。光說沒用,寫**測試一下(測試環境centos,g++4.8.5)。

內建普通變數:

// test.cpp

#include #include using namespace std;

#define n (1024*1024) // 1m

int main()

}// 編譯 g++ test.cpp -o test -std=c++11

// 1. 不delete時,記憶體一直在漲

// 2. 使用delete 時, 記憶體不漲

// 3. 使用delete 時, 記憶體不漲

測試發現,說的確實有道理啊,內建型別的陣列沒必要使用delete

於是再測測自定義型別:

#include #include using namespace std;

#define n (1024*1024) // 1m

class a

};int main()

}// 1. 不delete時,記憶體一直在漲

// 2. 使用delete 時, 記憶體不漲

// 3. 使用delete 時, 記憶體不漲

what?結果和內建型別一樣???這是為什麼,於是趕緊去查一查資料,發現自己對newdelete的理解確實錯了!趕緊重新總結一波。

記住一句話:new先分配記憶體,再呼叫建構函式delete先呼叫析構函式,再釋放記憶體。

那麼,如果new了乙個陣列,呼叫幾次建構函式呢,呼叫的是那乙個建構函式呢;delete陣列和delete陣列又分別呼叫幾次析構呢。可以做個實驗:

#include #include using namespace std;

class string

string(int n)

~string()

private:

char* m_data;

};int main()

// 1. new string[3],呼叫了3次無參的建構函式!

// 所以如果沒有無參建構函式會報錯

// error: no matching function for call to 'string::string()'

// 2. 使用delete 時,呼叫了一次建構函式

// 3. 使用delete 時, 呼叫了三次析構函式

其實看完這個例子,就能明白為什麼要用delete而不是delete了,因為只掉用一次析構函式,對於上面的**是錯的,會發生記憶體洩漏。因為string類中有指標成員。這些指標成員必須跟隨著string物件的銷毀而銷毀。

下面是記憶體分布圖:

在使用delete的時候,實際上是會刪除三個string物件佔據的記憶體,但是只有在呼叫string類的析構函式的時候,才會銷毀物件內部的m_data變數所指向的字串。而delete只會呼叫第乙個物件的析構函式,後面兩個string物件的析構函式不夠呼叫。而delete可以保證這一點。在使用new的時候,會記錄陣列的長度,如下圖,

delete會根據記錄的長度決定析構次數。

所以說,其實如果類中沒有new出來的資源,都是棧上的資源,無需呼叫建構函式來釋放資源的話,其實呼叫deletedelete沒有區別。而如果類中有指標變數,則對於這種物件的陣列,必須使用delete

可以編寫**測試,當乙個類中只有棧上的變數的時候,它組成的陣列用delete刪除是不會發生記憶體洩漏的。引言中的測試也證明了這一點。

牢牢記住:new先分配記憶體,再呼叫建構函式delete先呼叫析構函式,再釋放記憶體。delete只會呼叫陣列第乙個物件的析構函式,而delete會呼叫陣列中所有物件的析構函式。雖然有時候沒有影響,但是最好還是遵循規範,防止錯誤的發生,對於陣列都使用delete

[delete 和 delete 的真正區別](

重新了解物件導向

pytorch越看越邊緣,現在重頭看物件導向,因為之前一直是用微控制器,用c語言,對物件導向一知半解,今天有點空時間,深入學一學。主要 連線 python之路 初識物件導向 這位博主以人狗大戰為例,很形象的講述了物件導向的程式設計過程。class 類名 def init self,引數1 引數2 s...

C 中delete和delete 的區別

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

C 中delete和delete 的區別

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