Tuesday, March 9, 2010

How could pairing new[] with delete possibly lead to memory leak only?

Programmer Question

First of all, using delete for anything allocated with new[] is undefined behaviour according to C++ standard.



In Visual C++ 7 such pairing can lead to one of the two consequences.



If the type new[]'ed has trivial constructor and destructor VC++ simply uses new instead of new[] and using delete for that block works fine - new just calls "allocate memory", delete just calls "free memory".



If the type new[]'ed has a non-trivial constructor or destructor the above trick can't be done - VC++7 has to invoke exactly the right number of destructors. So it prepends the array with a size_t storing the number of elements. Now the address returned by new[] points onto the first element, not onto the beginning of the block. So if delete is used it only calls the destructor for the first element and the calls "free memory" with the address different from the one returned by "allocate memory" and this leads to some error indicaton inside HeapFree() which I suspect refers to heap corruption.



Yet every here and there one can read false statements that using delete after new[] leads to a memory leak. I suspect that anything size of heap corruption is much more important than a fact that the destructor is called for the first element only and possibly the destructors not called didn't free heap-allocated sub-objects.



How could using delete after new[] possibly lead only to a memory leak on some C++ implementation?



Find the answer here

1 comment:

  1. To avoid memory leaks in C++ apps I advise you to use Deleaker ( http://deleaker.com/ )

    ReplyDelete

LinkWithin

Related Posts with Thumbnails