Re: Memory leak in this case?
"George" <George@discussions.microsoft.com> ha scritto nel messaggio
news:13775422-4C15-4741-BCA7-17FBD822207D@microsoft.com...
Suppose I have a component (class) CX implements IUnknown interface, and I
have retrieved a pointer of CX by IUnknown pointer (IUnknown*), that is.
[Code]
IUnknown* pCX;
QueryInterface (IID_IUnknown, &pCX);
//...
delete pCX; // memory and resource leak here?
[/Code]
Even if I declare the component CX's destructor as virtual, if I delete
through IUnknown pointer to "release" the object, there is still potential
memory and resource leak, because in IUnknown interface, destructor is the
compiler provided default one, which is non-virtual and public, right?
Hi George,
If my understanding is correct, I think your problem is that you are
violating COM contract.
COM objects (interfaces) are reference counted, that means that you must
*not* do explicit 'delete' on them.
Instead, you should call Release() method (always implemented, as it is from
IUnknown, the root of all COM interfaces) when you don't need a COM object
anymore.
ISomeInterface * pX
...
// NOT: delete px;
// Do instead:
px->Release();
// Avoid dangling references
px = NULL;
In general, when you don't know if a pointer to an interface is valid (!=
NULL), I would suggest to do safe releasing, like this:
if ( px != NULL )
{
px->Release();
px = NULL;
}
which you can implement easily in a preprocessor macro, e.g.:
#define SAFE_RELEASE( p ) if ( (p) != NULL ) { (p)->Release(); (p) =
NULL; }
and use like this:
SAFE_RELEASE( pX )
A better advice would be to use COM smart pointers like CComPtr to manage
COM object reference counting.
http://msdn2.microsoft.com/en-us/library/ezzw7k98.aspx
It is good e.g. when you have several COM interface pointers, and you have
an error.
In that case, you should Release COM interfaces successfully allocated
before returning an erorr code, and if your interface is managed by a smart
pointer like CComPtr, this smart pointer will do the job for you (and your
code will be much simpler than manaully releasing version).
HTH,
Giovanni