The best way to prevent memory leaks to is use "defensive programming" from the very start. Always keep track of your pointers and what is being altered along the way. Delete what you created and initialize rather than just leaving empty until use.
But if you find that you have a leak or debugging someone else's code find where there is a bunch of pointer arithmetic and start your search there. A lot of leaks come from pointer use (which is why they have been phased out in later languages and why garbage collection has been implemented).
Match up your use of "new" with your use of "delete". Every object you declare do you cleanup? Are you using your destructors properly? Are you creating an object pointer and letting the object go out of scope so that your pointer is dangling?
Steps I use...
1) Start with your pointers - make sure you initialize them to null or an object. Make sure that object won't go out of scope on you. Do you have any complex pointer handling (like a node list?) your problems are probably going to be there.
2) Cleanup cleanup cleanup... use your destructors properly, are you effectively using delete? Are you recreating an object over and over again instead of deleting the old copies?
3) Always check the bounds of your arrays and make sure there is no way to write out of those bounds. You can do this as part of your number 4 tip....
4) Unit test your functions in a driver program and see if the leak exists there.
But the best tip I can tell you is to use good habits when initially coding a function and clean up resources as soon as you possibly can instead of saying "I will clean that up later" because you may forget all about it.
Hope this helps!