两个COM类A和B,A的成员属性引用B,B的成员属性引用A,两者的引用计数怎样处理?

解决方案 »

  1.   

    >>A的成员属性引用B,B的成员属性引用A
    什么意思?能举例说明吗?
    另外,引用计数是对接口来说的.
      

  2.   

    测试过了,两者不会被释放,直到程序结束。
    简单点说,就是A引用B即有B.AddRef(),在A::FinalRelease()里才被B.Release();而B引用A即有A.AddRef(),在B::FinalRelease()里才被A.Release()。
    这种情况下,两者“虽不同生,但却同死,而且最后才死”。另外,我认为引用计数是对类而言的,接口只是纯粹的“接口”,没有需要也没能力“计数”。而平常所说的COM接口,在C++中只是一个类所暴露出来的部分接口。
      

  3.   

    只有这样才是合理的:IA->AddRef(),IA->Release()。
    你这里的A是接口吗?
    所谓的A引用B什么意思?能给个例子吗?疑惑ing
      

  4.   

    对,互相抓住引用计数的两个对象,想要release对象,必须先主动解散它们,否则就谁也删部掉了。互相抓住引用计数的情况在回调接口时很常见。
      

  5.   

    详细分析可见《深入解析ATL》关于智能指针实现的那一节
    讲了为什么release的实现是:
    q = p; p = null; delete p;
    而不是
    delete p; p = null;
    就是为了避免lz所说的情况
      

  6.   

    1.6 资源管理
    显式的释放智能指针
    Release方法
    Template <class T> void CComPtr<T>::Release()
    {
    Iunknown* pTemp = p;
    If(pTemp){p = NULL; pTemp->Release();}
    }为什么不这样实现?
    If(p){p->Release(); p = NULL};
    来看看下面的情况
    Class A
    {
    CComPtr<B> m_ptB;
    };
    Class B
    {
    CComPtr<A> m_ptA
    }
    A a;
    B b;
    b.m_ptA = &a;
    a.m_ptB = &b;// 注意!
    a.m_ptB.Release();
    /* 下面为实际的底层调用
    a.m_ptB.Release();         =>
    If(m_ptB.p){m_ptB.p->Release(); m_ptB.p = NULL;} =>
    m_ptB.p->Release() =>
    b对象调用析构函数,解除对a的引用,a的引用为0,开始析构, m_ptB析构,发现m_ptB.p不为NULL,对其调用Release。第2次对m_ptB调用Release,行为未定义。
    */