One trick I find really useful is to add the following at the start of your main function:
#ifdef _DEBUG
// The following code is used for detecting memory leaks. If a memory leak is detected when the application exits,
// the information will be printed out to the debug output window. Change the -1 in _CrtSetBreakAlloc( -1 ) to the
// allocation number and run the code again... easy to tell if bits and pieces aren't being cleaned up
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
_CrtSetBreakAlloc( -1 );
#endif
You'll get a list of allocations that haven't been freed up when your program exits, then you just replace the -1 with the allocation number in _CrtSetBreakAlloc() so you can potentially see what was being allocated.
This certainly isn't foolproof, but it may help you out.