Re: Do I need to call Release on smart pointer
Jeff Partch [MVP] wrote:
"Igor Tandetnik" <itandetnik@mvps.org> wrote in message
news:%23qOuKeKhGHA.4304@TK2MSFTNGP05.phx.gbl...
With apologies and hesitation... Doesn't it depend on whether the
OtherFunc1 and/or OtherFunc2 AddRef the interface pointers they
return?
Well, I assumed OtherFunc1 and OtherFunc2 are correctly written. They
should return either a non-AddRef'ed raw pointer, or a smart pointer.
More apologies, but the reason I asked is that I routinely encounter
wizard generated wrappers which are keen to expose methods like:
LPDISPATCH GetHtmlDocument() -- that do return AddRef'd pointers, so
in a function like...
VOID CSomeClass::SomeFunc(VOID)
{
ISmartPointer p = m_someWrapper.GetSomeDispatch();
}
...you can expect the ref count to go up, up and up.
I'm not sure anymore - but some part of my brain says that the COM
guidelines suggested that functions that return an interface to a newly
allocated object should AddRef the pointer before returning it. This is the
convention for CoCreateInstace, for example. Such pointers are frequently
returned through T** or void** parameters instead of the function return
value. If you're using plain pointers, such conventions would seem to make
the code more clear and robust, but using smart pointers, it's a bit of a
conflict of interest. Fortunately, all of the (common) smart pointer
classes also provide a way to set the value of the contained pointer without
AddRef'ing it to accomodate such situations:
VOID CSomeClass::SomeFunc(VOID)
{
ISmartPointer p;
p.Attach(m_someWrapper.GetSomeDispatch());
}
In general, there's no way to tell which construct you need - other than
reading the documentation for GetSomeDispatch, which should clearly indicate
whether the returned interface has been AddRef'd.
In the COM smart pointer class that I always used, I added a couple more
member functions (inspired by a Don Box article, IIRC):
template<class T> class SmartPtr
{
// ...
T** AsPPTArg();
void** AsPPVArg();
};
-cd