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 callGetRenderTarget
, 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).
Release
more than once in practice, I was just asking why it didn't tear the program apart when I was trying to figure this out and tried it. – Lawyer