為了防止內存洩漏,每一個動態內存分配必須有一個等同相反的內存釋放操作,delete和new相對應,也有作為操作符的delete和作為函數的delete。
第一,操作符delete,對應操作符new,釋放內存,並自動調用類的析構函數,調用格式:
delete pointer;
第二,函數delete,對應函數new,操作符delete會調用函數delete釋放內存,函數原型是:
void operator delete(void *buffer);
舉個例子,語句delete ps;(ps是string指針)
對應的代碼可能是這樣的:
ps->~string();
operator delete(ps);
最後需要注意的是如果使用了placement new,這種情況下需要顯式調用類的析構函數,而不要調用操作符delete,因為這塊內存不是由函數new分配的,只有你知道它來自哪裡。
最最後再回憶一下今天的內容吧:
1. 函數delete
void operator delete(void *buffer); 釋放buffer所指向的內存。
2. 運算符delete,最常用的,沒什麼可說的。
3. 函數delete不會自動調用類的析構函數,因為它對分配的內存類型一無所知;而運算符delete會自動調用類的析構函數。
4. 函數delete允許重載,而運算符delete不能被重載。
5. placement new返回的地址,需要顯式調用類的析構函數,而不要調用操作符delete。
6. 比new簡短多了。