.NET doesn't leak memory
In one sense, this statement is literally true, but the there are problems in .NET which have the same symptoms. It's ultimately a question of definition:
When you used
free to manage memory yourself, a leak was what happened any time that you forgot to do the free part. Basically, you'd allocate some memory, you'd do some work with it, and then you'd forget to release it back to the runtime system.
The good news is that the .NET framework now takes care of freeing objects for you, and is also ultra-cautious. It works out whether it thinks a particular object is going to be needed while your program runs, and it will only release that object if it can completely guarantee that that object is not going to be needed again.
Unfortunately, the framework's careful approach also presents loopholes (through library caches, user interfaces, as well as the runtime and compiler themselves) which allow objects to live longer than they should.