c++ - 线程中使用的 CComQIPtr 引用计数问题
问题描述
我有一个程序也可以通过局部到成员变量的线程进行密集使用,例如(非常简单):ComQIPtr
ComQIPtr
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
在许多部分中使用),我不明白为什么。
解决方案
推荐阅读
- php - 检查当前行php
- java - 将多态对象列表反序列化为对象字段
- javascript - API 在未发送 /api/users/create 响应的情况下解析,这可能会导致请求停止。下一个
- python-3.x - 如何在具有多个参数的熊猫数据帧上调用函数
- flutter - 小部件是在应该使用之前创建的 => 导致错误
- mysql - 使用光标按几何距离分页
- c# - 获得无效的差异:类型参数必须是通用接口的不变有效错误
- javascript - JavaScript 中的任一类型实现
- python - 如何为 lineEdit 更改 QValidator 的行为:
- python-3.x - Selenium:单击下拉菜单中的菜单不起作用