, , : new malloc, (void*)(&(((int*)p)[1])), p - , int - , .
, , - sizeof (int) ( ) . , .
Then, when this pointer is passed for deletion, which transfers it to free, one int in front of the passed pointer looks for free to find the size that is being returned.
Rejecting something other than what we received will mean that the free one thinks that an arbitrary amount of actual memory is being transferred back, and this will spoil the free list accordingly.
Again, this is how it is often implemented, and not like new, delete, malloc or free.
source
share