大家都知道new
了乙個變數,需要使用delete
釋放記憶體,而new
出了乙個陣列,需要使用對應的delete
釋放記憶體。但我好像在哪看見過一種說法:針對系統內建型別,使用new分配後的不管是陣列還是非陣列形式記憶體空間用delete
和delete
都可以。光說沒用,寫**測試一下(測試環境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?結果和內建型別一樣???這是為什麼,於是趕緊去查一查資料,發現自己對new
和delete
的理解確實錯了!趕緊重新總結一波。
記住一句話: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
出來的資源,都是棧上的資源,無需呼叫建構函式來釋放資源的話,其實呼叫delete
和delete
沒有區別。而如果類中有指標變數,則對於這種物件的陣列,必須使用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 為自...