One tool you can use is BoundsChecker. BoundsChecker is a great tool, but it is slow, and expensive, and inextensible. I'll build a crude one today. Please note that it is currently not thread safe, but it is reasonably extensible. If you want to use it, go ahead, as I'm putting it into the public domain.
Pointers are tricky.
Overriding the standard memory allocation routines can catch the first three. Using a smart pointer class can catch the last one. Call the Win32 function to allocate the memory. Every time an allocation is made, I save the address in a linked list. When that memory is freed, I remove it from the list.