《COM原理与应用》的一处代码商讨,我认为处理不当

来源:互联网 发布:破解app软件 编辑:程序博客网 时间:2024/06/04 18:37

在看到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

原创粉丝点击