我读过一篇关于使用 boost::intrusive_ptr 管理 COM 对象的文章。作者展示了一个包装类,它负责为通常的 COM 语义调整智能指针。这是课程:
template <typename T>
class WrapPtr
{
public:
WrapPtr(boost::intrusive_ptr<T>& ref)
: m_ref(ref), m_ptr(0)
{
}
~WrapPtr()
{
// The second parameter indicates that the reference count should not be incremented
m_ref = boost::intrusive_ptr(m_ptr, false);
}
operator T**()
{
return &m_ptr;
}
operator void**()
{
// Some COM functions ask for a pointer to void pointer, such as QueryInterface
return reinterpret_cast<void**>(&m_ptr);
}
private:
T* m_ptr;
boost::intrusive_ptr<T> m_ref;
};
template <typename T>
WrapPtr<T> AttachPtr(boost::intrusive_ptr<T>& ref)
{
return WrapPtr<T>(ref);
}
我不明白的是析构函数。它将丢弃当前的 m_ref 对象(这Release
当然会导致调用),但随后他分配了一个从 m_ptr 成员构造的新 intrusive_ptr。我不明白为什么在析构函数中需要这样做,因为 Wrapper 类持有 intrusive_ptr 的副本,而不是对它的引用。如果被调用者改变了指向的对象,那么这个改变在析构函数离开后就会丢失。这是这里的错误还是我错过了什么?