Microsoft include a number of memory debugging routines.
By enabling this feature, you can run the program then arrange for [tt]_CrtDumpMemoryLeaks()[/tt] to be called at the end. This will contain a record of all the leaks.
From within the debugger, do these things:
Included in this information is an "allocation number", which can be used to initialise a variable ([tt]_crtBreakAlloc[/tt]) with the number of the first leak.
Run the program with exactly the same inputs and it should break on the first block which will leak. You can then track back into your code to see where the pointer is allocated and used, and from that determine who should be responsible for calling free()
Having fixed the first leak, which may fix a whole host of other leaks as well, then re-run your tests to find out the next leak.
As for the profiler in Visual Studio professional, I would suggest you create a small test program (say up to 10 functions) and practice with all the various options it has available. Correctly interpreting what the reports are trying to tell you is a bit of an art, so having some ideas from code you're totally familiar with will help.
> so that I'm not spending time learning one and then discovering that this other tool
> works more efficiently/accurately than the one I learned.
It's like choosing a car, you have to test drive several to really figure out which is best for you.
--
If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.