ATL / COM:为什么CComSafeArray :: GetCount()为空数组抛出异常?

时间:2014-01-16 18:22:58

标签: c++ com atl

我正在使用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()如果数组为空则应抛出异常。这是预期的行为吗?

1 个答案:

答案 0 :(得分:3)

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

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

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