I came across a leak in a Direct3D application of mine, and I ended up correcting it, but I think the cause of the leak was due to my misunderstanding of how Direct3D handles its memory and interfaces.

I haven't been able to find a definitive article/tutorial on it (please provide one if you have one), but from what I've gathered, it works as such:

* Every time you call a `Get` method, the number of references for the object returned is incremented. So if I call `GetRenderTarget`, the surface being rendered to has its reference count incremented.
* Calling `Release` on the interface decrements its reference count. These first two points combined essentially mean: every time you get an interface, release it after you're done with it.
* When the reference count reaches 0, the instance is deleted.

I'm not entirely sure if this is correct, but it seems to work in practice. If someone could clarify/confirm how it works, that'd be great.

P.S, are there any safeguards implemented in releasing interfaces? Calling `Release` any number of times on the back buffer doesn't seem to do any damage (which is a good thing, but I'm not sure why it doesn't).