It is not practical to use a debugger and trap malloc/free calls for a few of reasons:
The overhead of switching from one process to the other one is just to great on nontrivial programs.
You'll end up spending a similar amount of memory to store ownership information than with other methods. (This is what I actually wanted to improve)
There are quite a few functions that work the heap, and it could be easy to miss some.