Memory Leak and New

I'm a bit confused about the utility of crtdbg.h if I use the new function.

If I use malloc I get a nice report saying that line x of file y leaked z amount of memory. Nice.

If I use new, I get a pretty useless report that line 691 of crtdbg.h leaked z amount of memory. Well gee, thanks. I KNEW that new is being redirected to that inline function in crtdbg.h, I was kinda hoping maybe you could tell me where I came from, not where I went.

Here is the source:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main(int argc, char* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


int* leak = new( _NORMAL_BLOCK, __FILE__, __LINE__ ) int[50];
int* useless_leak = new int[10];

int* leak2 = (int*) malloc( sizeof(int) *25 );

return 0;
}

Here is my slightly useless report:
Detected memory leaks!
Dumping objects ->
.\fixed.cpp(76) : {91} normal block at 0x00891058, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\crtdbg.h(692) : {90} normal block at 0x00890FF0, 40 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
.\fixed.cpp(73) : {89} normal block at 0x00894F20, 200 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


As you can see, malloc works fine. If I explicitly call the new operator from the crtdbg.h file, I get a useful report. However, if I just all new, I get crtdbg.h. Even after I hacked crtdbg.h to use __forceinline so that I was sure that the function WAS being inlined, it doesn't matter. Apparently __LINE__ and __FILE__ aren't so useful for inline functions.

I'm using .NET 2003. Anyone have any ideas Do I need to flip an obscure switch that I couldn't find in the documentation Am I simply an idiot Did MS not test the new operator at all


Larry E. Ramey





Answer this question

Memory Leak and New

  • Zoiner Tejada

    after using malloc() use must use free(void *) to free the memory again or else it is considered a leak. And with new you must use delete to free the memory again or else you have a memory leak again .

    For example in your code use:
    free(leak);
    free(useless_leak);
    free(leak2);

  • Jan Buskens

    This issue has been nicely documented by Roshan James. See the article, "Another Tale of Real World Debugging" online at:

    http://www.thinkingms.com/pensieve/homepage/articles/tech/torwd/another_tale_of_real_world_debug.htm

    I am seeing the problem with "Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86" from the "Visual C++ 2005 Express Edition" distribution. Obviously this is a bug in the compiler that needs to be fixed by Microsoft.

    How do we get Microsoft's attention on this issue Can I see if a bug report is open for this or submit a bug so that Microsoft will be aware of and fix the problem


  • GREESH KUMAR MAHESHWARI

    i think the issue was addressed, the _crtDumpMemoryLeaks(); shows the line in cpp file where the leakl is happening



  • Dudley McFadden

    Thanks for the link to the bug reports. I find this issue is already addressed by bug FDBK17590, which is unfortunately marked as postponed. This is suprising to me as memory leak detection is such a fundamental part of C/C++ development.


  • URLmon

    I am exceedingly aware of what a leak is.

    My question, if you re-read it, was not about what a memeory leak is. I am curious as to why the information comming out of debug new operator defined in crtdbg.h was so useless.

    I would be very appriciative if anyone with a clue about the _Crt*** functions could explain to me how to get a useful file and line number out of new without having to re-write my 1,000,000 line project.

    Larry E. Ramey

  • Saurav Kr. Basu

    I think you have to create a special macro:

    http://msdn2.microsoft.com/en-us/library/19f56tw3.aspx

    #include "crtdbg.h"
    #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
    #define new DEBUG_CLIENTBLOCK



  • Witold Jaworski

    I suppose there's no harm in logging a bug at http://msdn.microsoft.com/bugs. However, I'm not sure how Microsoft can fix this issue without breaking code that relies on the workaround.



  • Memory Leak and New