在第162页上:
程序的倒数第二行看不懂
HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknown,const IID& iid,void** ppv)
{
if((pUnknownOuter!=NULL) && (iid!=IID_IUnknown))
{
return CLASS_E_NOAGGREGATION;
} CB* pB = new CB(pUnknownOuter);   //pB的引用计数在构造函数置为1 if(pB == NULL)
{
return E_OUTOFMEMORY;
} HRESULT hr = pB->NondelegatingQueryInterface(iid,ppv);
pB->NondelegatingRelease(); //pB的引用计数减为0,导致pB被释放?
return hr;
}

解决方案 »

  1.   

    //引用计数在下一行应该增加一
    HRESULT hr = pB->NondelegatingQueryInterface(iid,ppv);
      

  2.   

    每次查询一个接口(QueryInterface)时引用计数都增加了
    所以每次丢弃一个接口指针的时候都要release一次
      

  3.   

    在聚合的时候,NondelegatingQueryInterface(iid,ppv)导致的是其外部组件的引用计数的增加,内部组件的引用计数并没有改变,在P143上可以看到。
    reinterpret_cast<IUnknown*>(*ppv)->AddRef();
      

  4.   

    只有在查询IID_IUnknown的时候才会导致内部组件的引用计数增加,这里刚好是在查询IUNKNOWN