首页 > 解决方案 > 线程中使用的 CComQIPtr 引用计数问题

问题描述

我有一个程序也可以通过局部到成员变量的线程进行密集使用,例如(非常简单):ComQIPtrComQIPtr

class dummy
{
public:
 (some code)

    void calledFromThreads ()
    {
        if (m_memberVar.getType()==1)
        {
            CComQIPtr<type2> localVar(m_memberVar);
            (more code)
        }
    }

private:
    CComQIPtr<type1> m_memberVar;

}; 

密集使用后,有时在if (m_memberVar.getType()==1)线路中,会引发异常。

调试后,我看到指针指示0xdddddd(已删除内存),并且在另一次执行后,在m_memberVar内存位置放置了一个内存断点,我看到它在离开if (m_memberVar.getType()==1)块时被释放,在销毁时CComQIPtr<type2> localVar(m_memberVar)

恕我直言,这在理论上不应该发生,因为当它CComQIPtr被创建时它已经在AddRef内部产生了,所以Release当它CComQIPtr被销毁时不应该影响它(它是 +1 然后是 -1),即使有多个同时访问相同的函数,在减法之前总是有一个加法。

但事实是它发生(偶尔和随机),并且在代码的几个部分(它CComQIPtr在许多部分中使用),我不明白为什么。

标签: c++multithreadingcom

解决方案


推荐阅读