【发布时间】:2020-05-08 22:11:49
【问题描述】:
我查看了atlbase.h 以了解CComPtr<> 是如何实现的,并偶然发现了基类CComPtrBase<> 中的Release() 函数,它像这样释放底层对象:
// Release the interface and set to NULL
void Release() throw()
{
T* pTemp = p;
if (pTemp)
{
p = NULL;
pTemp->Release();
}
}
我的智力还不够好,看不出这个临时指针pTemp的意义何在?
为什么这段代码不只是:
void Release() throw()
{
if (p)
{
p->Release();
// EDIT:
p = NULL;
}
}
现在如果你看一下析构函数,析构函数的定义就像我对上面示例的期望一样,有什么区别?
【问题讨论】:
-
第二个版本没有为一件事设置
p = NULL;。 -
啊,好的,我已经编辑过了,但问题还是一样。
-
在两个线程同时调用 Release() 时使其安全。内存屏障在实现的 Release 函数中。
-
这不能防止并发访问,因为 p 的获取和清空不是互锁的。它保护的是可重入访问。
标签: c++ pointers com smart-pointers