在看到COM聚合一章,有些代码有疑问,百度了下,发现了下面的东西,其实很有必要再类构造函数里清空指针值,以免“乱指”。
发信人: jessecw (晨晨), 信区: MSDN
标 题: 《COM原理与应用》的一处代码商讨,我认为处理不当
发信站: BBS 水木清华站 (Fri May 30 19:52:23 2003), 转信
今天我对潘老师第3章,第4章的代码进行调试分析的时候,发现第4章的代码
有一处会在一个特定的情况下引起异常。
程序是../AggRe/CompB中的一段:
// Implemention of class CB
CB::CB ()
{
m_Ref = 0;
g_CompBNumber ++ ;
m_pUnknownInner = NULL;
}
CB::~CB ( )
{
m_Ref = 1;
IUnknown *pUnknownOuter = this;
pUnknownOuter->AddRef();
if (m_pSomeInterface != NULL)
m_pSomeInterface->Release();
if (m_pUnknownInner != NULL)
m_pUnknownInner->Release();
}
一般情况下,不会出现异常。但是当CompA中的组件没有进行注册的时候?br /> CompCtRl中:
//...
hResult = CoCreateInstance(compBCLSID, NULL,
CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
会调用失败,但这个时候出现了异常了。
原因是:B的类厂创建组件对象的时候出现了失败(A没有注册呀!)
HRESULT CBFactory::CreateInstance(IUnknown *pUnknownOuter,
const IID& iid, void **ppv)
{
CB *pObj;
HRESULT hr;
*ppv=NULL;
hr=E_OUTOFMEMORY;
if (NULL != pUnknownOuter)
return CLASS_E_NOAGGREGATION;
//Create the object passing function to notify on destruction.
pObj=new CB ();
if (NULL==pObj)
return hr;
pObj->AddRef(); // The Reference count of pObj is 1
hr = pObj->Init(); //当A没有注册的时候fail!
if (FAILED(hr) ) {
g_CompBNumber --; // Reference count g_CompBNumber be added in constructor
delete pObj; //会引起异常!
return E_FAIL;
}
//Obtain the first interface pointer (which does an AddRef)
hr=pObj->QueryInterface(iid, ppv);
pObj->Release(); // The Reference count of pObj is 1
return hr;
}
修改如下:
CB::CB ()
{
m_Ref = 0;
g_CompBNumber ++ ;
m_pUnknownInner = NULL;
//added by jessecw
m_pSomeInterface=NULL;
m_pUnknownInner=NULL;
}
这样就不会出现这个异常了。
我发这个帖子,不是说潘老师的书写的不好,相反我认为很不错,我买了一本在仔细
领会,如果不是仔细分析是不会发现这个小问题的。
我就是想拿出来和大家讨论讨论。请不要误会!
3X
--
Java is not platform-independent, it is the platform.
--Bjarne Stroustrup
http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FMSDN%2FcomAnddcom%2FM.1054294912.d0