C++におけるdeleteとdelete[]の違い


deleteが呼び出されると、割り当てられたオブジェクトの構造関数が自動的に呼び出されます.
new[]で割り当てられたオブジェクトが基本データ型である場合、deleteとdelete[]で区別されません.ただし、割り当てられたオブジェクトがカスタムオブジェクトである場合、両者は共通ではありません.
一般にnewで割り当てられたオブジェクトはdeleteで解放される.new[]で割り当てられたメモリはdelete[]で1つずつ解放されます.
new[]とdelete[]については、上記の2つの状況に分けることができます:1.基本データ型にスペース2を割り当て、回収する.カスタムオブジェクトタイプのスペースの割り当てと回収
じっけん
#include <iostream>
using namespace std;
 
class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
 
int main()
{
  const int NUM = 3;
 
  int* a = new int[3];
  delete[] a;
  delete a;//   

  T* p1 = new T[NUM];
  //  delete[] p1;//   ,  
  delete p1;
 
  T* p2 = new T[NUM];
  delete[] p2;
}

実行結果からdelete p 1は空間を回収する過程でp 1[0]というオブジェクトだけが構造関数を呼び出し,他のオブジェクトp 1[1]、p 1[2]などは自身の構造関数を呼び出していないことが問題であることが分かる.delete[]を使用すると、スペースを回収する前にすべてのオブジェクトが最初に独自の構造関数を呼び出します.
基本データ型のオブジェクトには構造関数がないので、基本型からなる配列空間を回収するにはdeleteとdelete[]を使用することができるはずです.ただし、クラスオブジェクト配列ではdelete[]しか使用できません.newの単一オブジェクトの場合、delete[]でスペースを回収することはできません.
だから簡単な原則を覚えておけばいい:newで割り当てられた空間をdeleteで回収し、new[]で割り当てられた空間をdelete[]で回収する