Use a memory profiler. Visual studio has one built in, but there are also third party software like dotMemory or ANTS that may offer more features or a better user interface, at a cost.
If you take a memory snapshot you should be able to browse all objects in memory, and allow you to search for objects of a specific types. A common workflow is to take one snapshot, do something in the application, take another snapshot, and then compare the two snapshots. If the later snapshot has more objects it might indicate a memory leak.
There is usually also a way to trace the references to objects that should help you figure out why the objects are not released.
Another feature that is sometimes useful is to right click on a reference in the watch window and select “Make Object ID”. This lets you distinguish between object instances. So if you expect to have one object but hit breakpoints where this have different IDs, then you know you have a problem. See Tips and Tricks for more info.