揮発性のメモ2

http://d.hatena.ne.jp/iww/

delete[]の存在理由がわからない

単に new[] と対にしたかっただけなのか。
delete a;としたときはa[0]が解放されるだけ という説明も意味がわからない。a[0]だけを解放する手段なんてそもそも無いのに。つーか、delete a;は未定義だしなんかアボートするし
delete a;を文法エラーにしない理由もわからない。delete a;が正しく動作し意味があるサンプルコードが無い以上、せめてwarning出すくらいのことは必要なはず。
new char[5];も意味が不明。クラスじゃないんだからmalloc()で充分だと思う。
C/C++は未定義と不定が多すぎる。ルールの知識を競うゲームじゃないんだから、全部きっちり定義すべき。

stringPtr2に対して、[]を付けずにdeleteを適用したらどうなるでしょう。その場合でも、結果は未定義なのです。 しかし、いずれにしても、呼び出されるデストラクタは1つだけでしょう。
なお、これがクラスのオブジェクトではなく、intのようなデストラクタを持たない組み込み型の配列であっても、結果は未定義(ときには、危険)になります。

Effective C++ 16項 対応するnewとdeleteは同じ形のものを使おう
#include <iostream>
using namespace std;

class AAA{
  public:
    AAA(){ cout << "new" << endl; }
    virtual ~AAA(){ cout << "delete" << endl; }
};

int main(){
    char *hoge = new char[5];
    delete[] hoge;
    
    AAA *a = new AAA[5];
    delete[] a;

    cout << "end" << endl;
    return 0;
}