Re: COM Smart pointer doesn't keep its reference
Zee <zeidman@hotmail.com> wrote:
// Returns the current member
CObj2* CCol2::getObj2(void)
{
COMNamespace::_CCOMCol2Ptr pCOMCol2;
COMNamespace::ICommonObjectPtr pDataObjPtr;
COMNamespace::_CCOMObj2Ptr pCOMObjPtr;
HRESULT hr;
hr = pCOMCol2.CreateInstance(__uuidof(COMNamespace::CCOMCol2));
hr = pCOMObjPtr.CreateInstance(__uuidof(COMNamespace::CCOMObj2));
pDataObjPtr = m_pCollection->Item[m_lCurrent];
hr = pDataObjPtr.QueryInterface(__uuidof(COMNamespace::_CCOMObj2),
(void**) &pCOMObjPtr);
You are leaking a reference here. pCOMObjPtr already stores an AddRef'ed
COM pointer, but your QueryInterface call would overwrite the old value
without releasing it first.
CObj2* pObj2 = new CObj2(pCOMObjPtr,m_pSessionContext,m_sParentID);
I assume CObj2's constructor stores raw COM interface pointers it takes
as parameters in CObj2's member variables. Do you AddRef the poitners
before storing them? You should. Otherwise, when pCOMObjPtr et al go out
of scope, they will release the underlying raw pointers, their reference
counts will go to 0 and the objects will be destroyed. CObj2 ends up
with dangling references to no-longer-existing objects.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925