Click here to Skip to main content
15,868,292 members
Articles / Programming Languages / C++
Article

Trace Utility for preventing memory leaks

Rate me:
Please Sign up or sign in to vote.
3.56/5 (9 votes)
24 Jan 20031 min read 85.7K   542   23   21
Beware of memory leaks with new and delete.

Introduction

Writing our own trace utility is much important for complicated and complex applications. This is useful since C++ does not have the concept of GC (garbage collector) unlike C# or Java which automatically takes care of those issues. A good trace file can help a lot if you are trying to find hard-to-find memory leaks that often arise during the production of an application.

So, what we need is an easy utility that detects the memory leaks in place when the application is run. Also, that finds out where exactly the memory leak is and how many bytes of memory is not freed.

Using the code

Mainly, we want to rewrite the new function so that whenever new is called, it adds the trace, and of course, for delete, we have to remove the trace. Both the methods should be ssynchronous with each other; failing to call delete will trigger a memory leak.

#define New new(__FILE__, __LINE__)
      inline void * __cdecl operator new(size_t size, 
                 const char *fileName, int lineNumber)
      {
          void *ptr = (void *)malloc(size);
          addTrace((DWORD)ptr, size, fileName, lineNumber);
          return(ptr);
      };
      
//And for Delete this is supposed to be called.

      void __cdecl operator delete(void *p)
      {
          removeTrace((DWORD)p);
          free(p);
      };
      
      
void Dump()
      {
              // The iterator that walks us through.
          AllocatedList::iterator i;
          DWORD totalSize = 0;
          char buf[1024];

          if(!allocatedList)
              return;

          for(i = allocatedList->begin(); i != allocatedList->end(); i++) {
              sprintf(buf, "%-50s:\t\tLINE %d,\t\tADDRESS %d\t%d NOTFREED\n",
                  (*i)->fileName, (*i)->lineNumber, (*i)->address, (*i)->size);
              printf("%s",buf);
              totalSize += (*i)->size;
          }
          sprintf(buf, 
            "\n-----------------------------------------------------------\n");
          printf("%s",buf);
          if(!totalSize) 
          {
              sprintf(buf,"There are no MEMORY LEAKS\n");
              printf("%s",buf);
          }
          else
          {
              sprintf(buf, "Total UNFREED MEMORY: %d bytes\n", totalSize);
              printf("%s",buf);
          }
      };

For checking the results, we need a helper method that walks us through the memory leaks. Finally, we write a method that shows exactly where the memory is leaking, what is the address, and how many bytes are leaked.

main(){
char *str = "This is a Testing Program";
int len = strlen(str);
char *ptr;
ptr = New char[len+1];
strcpy(ptr,str);
delete ptr;
Dump();
}

Take a look at the main function. Instead of calling new char[len+1];, I am calling New. This will add the trace, and delete will remove the trace.

Hope this one is useful too.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here



Comments and Discussions

 
GeneralOn Trace utility for memory leaks Pin
Shivani270218-Jul-06 0:54
Shivani270218-Jul-06 0:54 
Questionis it useful for constructor taking some param? Pin
10-May-05 19:56
suss10-May-05 19:56 
Generalum, copy and paste from another website Pin
Anonymous29-Jun-04 9:06
Anonymous29-Jun-04 9:06 
QuestionMultithread safe? Pin
John M. Drescher16-Feb-04 3:45
John M. Drescher16-Feb-04 3:45 
AnswerRe: Multithread safe? Pin
Anonymous12-Aug-05 3:14
Anonymous12-Aug-05 3:14 
GeneralRe: Multithread safe? Pin
John M. Drescher12-Aug-05 3:25
John M. Drescher12-Aug-05 3:25 
GeneralIt's good article, and there is something to know Pin
objects28-Jan-03 17:44
objects28-Jan-03 17:44 
GeneralRe: It's good article, and there is something to know Pin
Anonymous29-Jan-03 8:43
Anonymous29-Jan-03 8:43 
GeneralRe: It's good article, and there is something to know Pin
smalbon14-Oct-04 4:50
smalbon14-Oct-04 4:50 
GeneralRe: It's good article, and there is something to know Pin
Samar Aarkotti29-Jan-03 14:45
Samar Aarkotti29-Jan-03 14:45 
QuestionOnly works on Win32? Pin
Mandalis25-Jan-03 23:10
Mandalis25-Jan-03 23:10 
AnswerRe: Only works on Win32? Pin
Michael Dunn25-Jan-03 23:29
sitebuilderMichael Dunn25-Jan-03 23:29 
AnswerRe: Only works on Win32? Pin
Samar Aarkotti26-Jan-03 5:12
Samar Aarkotti26-Jan-03 5:12 
GeneralRe: Only works on Win32? Pin
Mandalis27-Jan-03 19:36
Mandalis27-Jan-03 19:36 
GeneralModify your code Pin
Abbas_Riazi25-Jan-03 17:57
professionalAbbas_Riazi25-Jan-03 17:57 
GeneralRe: Modify your code Pin
A. Samar25-Jan-03 19:01
sussA. Samar25-Jan-03 19:01 
QuestionHow is this better? Pin
Marc Clifton25-Jan-03 12:59
mvaMarc Clifton25-Jan-03 12:59 
AnswerRe: How is this better? Pin
PJ Arends25-Jan-03 13:32
professionalPJ Arends25-Jan-03 13:32 
Because it does not use MFCConfused | :confused:

I personally do not have enough knowledge in this area to say if this is a good implementation or not, so I will not rate this article. But I will not dump on it either, just because MFC already provides similiar functionality.



CPUA 0x5041

Sonork 100.11743 Chicken Little

"So it can now be written in stone as a testament to humanities achievments "PJ did Pi at CP"." Colin Davies

Within you lies the power for good - Use it!
GeneralThis not an MFC article. Pin
Samar Aarkotti25-Jan-03 14:47
Samar Aarkotti25-Jan-03 14:47 
GeneralSo god damn... Pin
Rickard Andersson2025-Jan-03 11:57
Rickard Andersson2025-Jan-03 11:57 
GeneralRe: So god damn... Pin
Samar Aarkotti25-Jan-03 15:18
Samar Aarkotti25-Jan-03 15:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.