Possible Duplicate:
Why [] is used in delete ( delete [] ) to free dynamically allocated array?
Why does C++ still have a delete[] AND a delete operator?
I’m wondering what’s their difference and I know the obvious answer some might say, that one is to delete an array and the other is to delete a single object but I’m wondering why should there be two different deletion methods for these two operations? I mean delete is basically implemented using C free method which doesn’t care if the pointer is actually pointing toward an array or a single object. The only reason I can think of is two be able to know if it’s an array and call destructor for each cell instead of only the first object but that wouldn’t also be possible since compiler can not guess the length of array just looking at it’s pointer. By the way though it’s said to invoke undefined behavior to call delete for memory allocated with new[] I can’t imagine anything that could possibly go wrong.
As you have discovered the compiler needs to know the length of an array (at least for non-trivial types) to be able to call destructors for each element. For this new[] typically allocates some extra bytes to record the element count and returns a pointer to the end of this bookkeeping area.
When you use delete[] the compiler will look at the memory before the array to find the count and adjust the pointer, so that the originally allocated block is freed.
If you use
deleteto destroy a dynamically allocated array, destructors for elements (except the first) won’t be called and typically this will end up attempting to free a pointer that doesn’t point to the beginning of an allocated block, which may corrupt the heap.