Visual C++ has some heap diagnostics. I can't remember how to use them off hand, but the idea is you initialise it at the start of your program, run the program, then dump some info at the end. It tells you the allocation number and the line of code that made the allocation. It really is quite good.
I used it last to track down a memory leak that turned out to be in a COM Factory in some component we didn't own.
It's also included by MFC to generate the memory leak trace at the end of a run.