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

Memory Leak Finder

Rate me:
Please Sign up or sign in to vote.
3.68/5 (39 votes)
22 Feb 2012MIT2 min read 344.3K   4.5K   126   90
Custom memory handler with memory leak reporting and no-mans-land checking. Leaks are reported with call stack of allocation.

Sample Image - Memory_leak_finder.jpg

Introduction

Have you ever had a memory leak? Wished you knew where you allocated it and how? Is your boss cheap and refuses to buy Boundchecker or another debugging tool?

Here is the solution for you. A memory leak detector compiled directly into your code. It reports memory leaks with call stack of the allocation down to a user defined depth.

As an add-on, it does simple checks of the memory before and after the memory block, to track buffer overwrites.

Usage

Include tracealloc.cpp in your project. Define DETECT_LEAKS in the project settings. Compile. Run your application. Memory leaks are reported into your debug output window when the application terminates. Just click the memory leak and the correct file and line will be shown.

You can find further instructions in the source code.

How Is It Done?

The code overrides operator new and operator delete. For each allocation made, the code allocates extra space for tracking, call stack and no-mans-land. The current call stack is fetched and remembered, finally the code puts the newly allocated block in a linked list and the requested memory is returned.

When a memory block is deleted, the header is found and checked for buffer overwrites. The memory block is then removed from the linked list and deallocated.

When the program terminates, the global memory tracker object is deleted. The destructor traverses the linked list for memory blocks that isn’t deleted (= leaked memory). It then fetches symbol information for the call stacks and dumps the information in the debug console.

Limitations

The code is Microsoft Visual Studio and Win32 specific. It requires a debug build. The code is C++ specific. It handles new/delete but not malloc/free. The code will run slower with leak detection active (roughly at half normal debug build speed).

Finally

I want to thank Zoltan Csizmadia who wrote ExtendedTrace. I have used parts of his code for stack walking and symbol lookups.

I also want to thank the Code Project community. I have found many solutions or pointers in the right direction here. I hope I have given something back with this contribution.

Thank you!

History

  • February 22, 2012
    • Inclusion of contributed bug fixes (author acknowledged in read me file)
    • Upgrade of solution to Visual Studio 2010

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer (Senior)
Sweden Sweden
B.Sc in Software engineering

Writing software for the finance market.
Languages known: C/C++, SQL, Java, Perl, M68000 assembly and more. Give me the syntax and I'll program in it.

In my spare time i like to watch movies, read books and play computergames.

Comments and Discussions

 
GeneralRe: Linker Errors Pin
matakk10-Oct-08 18:22
matakk10-Oct-08 18:22 
GeneralRe: Linker Errors Pin
Erik Rydgren12-Oct-08 20:29
Erik Rydgren12-Oct-08 20:29 
GeneralThanks. Pin
mark-w12-Sep-07 14:55
mark-w12-Sep-07 14:55 
GeneralCompile errors in VC8 Pin
David_Leikis5-Jun-07 9:16
David_Leikis5-Jun-07 9:16 
GeneralRe: Compile errors in VC8 Pin
David_Leikis5-Jun-07 9:26
David_Leikis5-Jun-07 9:26 
GeneralTrouble in tracking memory leak Pin
Chandrasekar S10-Oct-05 2:20
Chandrasekar S10-Oct-05 2:20 
GeneralMissing __cdecl Pin
João Paulo Figueira4-May-05 10:05
professionalJoão Paulo Figueira4-May-05 10:05 
GeneralFixing bugs Pin
Sergey Solozhentsev5-Dec-04 21:03
Sergey Solozhentsev5-Dec-04 21:03 
I've solved your problem with detect leaks in dll. At first, you should add this code
....
HANDLE g_hSymInitProcess = NULL;
....
Then in InitSymInfo tou should add
DWORD dwProcessID = GetCurrentProcessId();
g_hSymInitProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);

BOOL Res = SymInitialize( g_hSymInitProcess, lpszSymbolPath, TRUE);
You cannot use GetCurrentProcess() (see MSDN for SymInitialize)
And then replace all GetCurrentProcess() with g_hSymInitProcess
In ~cLeakDetector() add CloseHandle(g_hSymInitProcess)
After that you should compile dll without exporting any additional functions. And it will detect all memory leak in dll. The same is in execitable.

And I want you to write about how to install debuging tools. I met with this problem and some interesting things. After install debuging tools there is the old version of dll in WinDir\System32. The same after manualy replace dll. So I found that Windows replace dbhhelp.dll if it find that this dll is not native (same for all system dll). So that you should firstly replace dbghelp.dll in dllcache folder and after that in system32 follder.
GeneralTrouble Getting Leak Details Pin
Qndrez5-Nov-04 19:24
Qndrez5-Nov-04 19:24 
GeneralRe: Trouble Getting Leak Details Pin
Erik Rydgren7-Nov-04 20:30
Erik Rydgren7-Nov-04 20:30 
GeneralGetLastError() after new Pin
Misanthrop7-Oct-04 5:48
Misanthrop7-Oct-04 5:48 
GeneralRe: GetLastError() after new Pin
Erik Rydgren8-Oct-04 4:17
Erik Rydgren8-Oct-04 4:17 
Generalwrong line numbers pointed Pin
bnujos29-Sep-04 20:51
bnujos29-Sep-04 20:51 
GeneralRe: wrong line numbers pointed Pin
Erik Rydgren29-Sep-04 22:53
Erik Rydgren29-Sep-04 22:53 
GeneralCompiler error with _UNICODE Pin
jpteruel27-Sep-04 22:23
jpteruel27-Sep-04 22:23 
GeneralRe: Compiler error with _UNICODE Pin
Erik Rydgren27-Sep-04 23:19
Erik Rydgren27-Sep-04 23:19 
GeneralRe: Compiler error with _UNICODE Pin
jpteruel27-Sep-04 23:35
jpteruel27-Sep-04 23:35 
GeneralRe: Compiler error with _UNICODE Pin
Erik Rydgren27-Sep-04 23:40
Erik Rydgren27-Sep-04 23:40 
GeneralRe: Compiler error with _UNICODE Pin
jpteruel28-Sep-04 2:22
jpteruel28-Sep-04 2:22 
Generalusing memory leak finder in a project with multiple dlls Pin
Kevin Cao20-Sep-04 20:24
Kevin Cao20-Sep-04 20:24 
GeneralRe: using memory leak finder in a project with multiple dlls Pin
Erik Rydgren22-Sep-04 3:26
Erik Rydgren22-Sep-04 3:26 
GeneralRe: using memory leak finder in a project with multiple dlls Pin
Dieter Hammer23-Sep-04 5:28
Dieter Hammer23-Sep-04 5:28 
GeneralRe: using memory leak finder in a project with multiple dlls Pin
Erik Rydgren23-Sep-04 5:40
Erik Rydgren23-Sep-04 5:40 
GeneralRe: using memory leak finder in a project with multiple dlls Pin
Curtis W23-Sep-04 7:25
Curtis W23-Sep-04 7:25 
GeneralRe: using memory leak finder in a project with multiple dlls Pin
Erik Rydgren23-Sep-04 20:27
Erik Rydgren23-Sep-04 20:27 

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.