Everything you allocate with new [] has to be deallocated with delete [], and everything you allocate with new has to be deallocated with delete.
There is no reason, this is how it will work correctly.
yes, there is a reason. The new operator allocates a pointer, which is just a pointer, while new[] allocates an array, which is way different than just a pointer, except that it is internaly a pointer to the first element. But the compiler know which is which, and you must use new ... delete ONLY for raw pointers, and new [] ... delete [] ONLY for arrays. No. 1 uses delete for an array, and no. 3 uses it for an object of type ClassA, both of wich is impossible.