Итак, у нас есть этот код
_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;
m_pInterface = cp.m_pInterface;
cp.m_pInterface = nullptr;
if (pOldInterface != nullptr) {
pOldInterface->Release();
}
}
return *this;
}
pOldInterface
- это Release()d
при назначении хода.Почему операции присваивания / конструктора перемещения не реализованы в виде свопов, которые позволяют Release()
происходить естественным образом в деструкторе перемещенного объекта, просто используйте присваивание nullptr
или Release()
, чтобы вручную запустить его раньше?
Я всегда реализую перемещениеКонструкторы как операции обмена.Это плохая практика?
Мой код будет
_com_ptr_t& operator=(_com_ptr_t&& cp) throw()
{
if (m_pInterface != cp.m_pInterface) {
Interface* pOldInterface = m_pInterface;
m_pInterface = cp.m_pInterface;
cp.m_pInterface = pOldInterface;
// or just std::swap(m_pInterface, cp.m_pInterface);
}
return *this;
}
Есть ли причина выбора MS _com_ptr_t
?Этот вопрос также относится к любому назначению / конструктору перемещения, поэтому этот контекст более / менее актуален.Все дело в том, выпускаем ли мы данные или меняем их?