I have 4 additional items to add to this discussion:
Terminating threads (Thread.Abort()) that have created UI Controls without properly preparing for such an event may lead to memory being used expectantly.
Accessing unmanaged resources through Pinvoke and not cleaning them up may lead to memory leaks.
Modifying large string objects. Not necessarily a memory leak, once out of scope, GC will take care of it, however, performance wise, your system may take a hit if large strings are modified often because you can not really depend on GC to ensure your program's foot print is minimal.
Creating GDI objects often to perform custom drawing. If performing GDI work often, reuse a single gdi object.