In .NET perspective:
I guess in a managed environment, a leak would be you keeping an unnecessary reference to a large chunk of memory around.
Absolutely. Also, not using the .Dispose() method on disposable objects when appropriate can cause mem leaks. The easiest way to do it is with a using block because it automatically executes .Dispose() at the end:
StreamReader sr;
using(sr = new StreamReader("somefile.txt"))
{
//do some stuff
}
And if you create a class that is using unmanaged objects, if you're not implementing IDisposable correctly, you could be causing memory leaks for your class's users.