This is a question that’s been nagging me for some time. I always thought that C++ should have been designed so that the delete operator (without brackets) works even with the new[] operator.
In my opinion, writing this:
int* p = new int;
should be equivalent to allocating an array of 1 element:
int* p = new int[1];
If this was true, the delete operator could always be deleting arrays, and we wouldn’t need the delete[] operator.
Is there any reason why the delete[] operator was introduced in C++? The only reason I can think of is that allocating arrays has a small memory footprint (you have to store the array size somewhere), so that distinguishing delete vs delete[] was a small memory optimization.
It’s so that the destructors of the individual elements will be called. Yes, for arrays of PODs, there isn’t much of a difference, but in C++, you can have arrays of objects with non-trivial destructors.
Now, your question is, why not make
newanddeletebehave likenew[]anddelete[]and get rid ofnew[]anddelete[]? I would go back Stroustrup’s ‘Design and Evolution’ book where he said that if you don’t use C++ features, you shouldn’t have to pay for them (at run time at least). The way it stands now, anewordeletewill behave as efficiently asmallocandfree. Ifdeletehad thedelete[]meaning, there would be some extra overhead at run time (as James Curran pointed out).