I know that I am supposed to use std::vector or other alternatives, but there’s something I don’t understand with pointers.
When we create a pointer array:
int* a = new int[100];
It should allocate a space of 100 * sizeof(int), isn’t it?
When we don’t need it anymore, we do:
delete [] a;
1.
delete a;
But when I actually do this (once accidentally in a recreational program), no runtime error (unllike in part 3 below) seems to be triggered and the program runs normally (despite possible memory leaks). Why? And does it actually deleted (freed) the first element of the array?
2.
According to a question on StackOverflow, delete[] knows the size of the array that it needs to delete.
But what happens when I delete the wrong thing? (It causes a runtime error… on codepad.org it shows memory clobbered before allocated block and something Debug Assertion Failed in VS2010.) Why don’t it just delete (free) elements 1 to 99?
delete [] &a[1]; // or
delete [] (a + 1);
3.
The following code also shows memory clobbered before allocated block. But why don’t it just delete (free) the element 99? And why does it cause an error, but just delete a like in part 1 doesn’t?
delete &a[99]; //or
delete (a + 99);
Did C++ standards actually states what will happen for the above things?
According to the C++ standard, deleting objects allocated with
new[]usingdeleteis undefined behavior. Anything can happen – from “nothing” to corrupting your heap beyond all recognition. It makes no sense to say what exactly gets deleted in cases like that, because it is heavily system-dependent.Deleting “a wrong thing” is undefined behavior. Typically, this corrupts your heap, because common implementations of allocators expect certain values to be stored just prior to the address that you pass for deallocation. This is by no means a standard, so again, anything can happen.
It does not delete the element 99 because it never allocated element 99: it allocated an array of 100 items, not a single
int; it expects you to deallocate all 100 items at once – you cannot deallocate it in any other way.