1. 程式人生 > >C++中delete和delete[]的區別

C++中delete和delete[]的區別

C++告訴我們在回收用 new 分配的單個物件的記憶體空間的時候用 delete,回收用 new[] 分配的一組物件的記憶體空間的時候用 delete[]。

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

請看下面的程式。

#include <iostream>;
using namespace std;

class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor"
<< endl; } }; int main() { const int NUM = 3; T* p1 = new T[NUM]; cout << hex << p1 << endl; // delete[] p1; delete p1; T* p2 = new T[NUM]; cout << p2 << endl; delete[] p2; }

大家可以自己執行這個程式,看一看 delete p1 和 delete[] p1 的不同結果,我就不在這裡貼執行結果了。

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

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

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