【发布时间】:2013-09-11 12:47:43
【问题描述】:
问题:
在 COM 中,您偶尔会发现带有 this 等签名的函数:
HRESULT STDMETHODCALLTYPE GetColorContexts(
UINT cCount,
IWICColorContext **ppIColorContexts,
UINT *pcActualCount)
这给我带来的问题是ppIColorContexts 必须是IWICColorContext * 的initialized 数组。我尝试引用ATL::CComPtr<IWICColorContext> 的Vector 的第一个元素,但没有这样的运气,它不会触发() 运算符,因此它会抱怨类型不匹配。
尝试的解决方案:
-
vector<ATL::CComPtr<IWICColorContext>>由于类型不匹配而失败,如 cmets 中所述,这还有其他问题,因为似乎这是 fixed in C++11 并包含在VC2010中的STLCComPtr重载operator &会破坏 STL 容器。 -
BOOST_SCOPE_EXIT_ALL有效,但仍然意味着我正在手动管理 COM 对象的生命周期,这是我想摆脱的。
未尝试的解决方案:
- 自定义数据结构 - 如果没有更优雅的解决方案,这可能是我必须要做的,但至少它可以让我正确利用破坏语义。
- 在此调用后附加
CComPtr- 我不喜欢此解决方案,因为它给我留下了一段执行期,如果出现问题,资源可能不会被释放。 -
std::unique_ptr<IWICColorContext[]>带有自定义删除器 - 我还没有完全探索这种可能性,但它可以确保 COM 对象总是被释放。
【问题讨论】:
-
它想要一个数组,只需传递一个普通的旧数组。任何使用智能指针的包装都必须在调用之后完成。
-
我想你想要这样的东西:
vector<CAdapt<CComPtr<IWICColorContext> > > vec; GetColorContexts(vec.size(), &vec[0].m_T, ...);。CComPtr不能直接放入 STL 容器中,因为它重载了operator&,这违反了容器要求。这就是CAdapt被发明的原因。 -
@HansPassant 我希望避免这种情况,但如果这是我必须要做的,那就是我必须要做的......我仍然希望避免
new -
@HansPassant 带有自定义删除器的
std::unique_ptr<IWICColorContext[]>怎么样?仍然不理想......但它应该总是被释放。 -
@IgorTandetnik 是 fixed in C++11 并且修复包含在 VC2010 的 TR1 版本中