【问题标题】:ATL/COM: Why does CComSafeArray::GetCount() throw an exception for an empty array?ATL/COM:为什么 CComSafeArray::GetCount() 会为空数组抛出异常?
【发布时间】:2014-02-05 20:02:21
【问题描述】:

我正在使用ATL CComSafeArray 类,但是如果数组为空,似乎GetCount() 会抛出异常,例如此代码会抛出异常:

CComSafeArray<MyStruct> array;
// array.Add(item); // There won't be an exception if I uncomment this line.
array.GetCount();

这是构造函数和 GetCount() 的代码(来自 ATL 源代码):

CComSafeArray() throw() : m_psa(NULL)
{
}
ULONG GetCount(UINT uDim = 0) const
{
    ATLASSUME(m_psa != NULL);
    ATLASSERT(uDim < GetDimensions());
    LONG lLBound, lUBound;
    HRESULT hRes = SafeArrayGetLBound(m_psa, uDim+1, &lLBound);
    ATLASSERT(SUCCEEDED(hRes));
    if(FAILED(hRes))
        AtlThrow(hRes);
    hRes = SafeArrayGetUBound(m_psa, uDim+1, &lUBound);
    ATLASSERT(SUCCEEDED(hRes));
    if(FAILED(hRes))
        AtlThrow(hRes);
    return (lUBound - lLBound + 1);
}

如你所见,构造函数给m_psa一个NULL值,而在GetCount()中,这会导致SafeArrayGetLBound()返回一个错误HRESULT,从而导致AtlThrow()被调用。

但我不明白为什么GetCount() 应该在数组为空时抛出异常。这是预期的行为吗?

【问题讨论】:

  • 旁白:为什么充满样板文件的微软库看起来难以阅读?
  • 这就是他们的风格! :)
  • Count 对未定义数组的实际期望是什么?
  • 零,如std::vector
  • 您有一个未初始化的数组。卡布姆。调用 Add() 是一种解决方法,但效率极低,每次 Add() 调用都需要调整数组的大小。你应该指定你需要的界限。请记住,数组不是向量。

标签: c++ com atl


【解决方案1】:

您有一个 SAFEARRAY 的未绑定包装器,而不是一个空数组。

如果你想要一个空的 SAFEARRAY,你可以声明一个:

CComSafeArray<MyStruct> array((ULONG)0);

【讨论】:

  • 是的,SAFEARRAY 用词不当。不知道为什么他们不会在那里返回零。同样,为什么 CComSafeArray 的默认构造函数不声明一个空的呢?也许在 Visual Basic 方面,区分空值和空值的唯一方法是例外。
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 2021-03-04
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多