我正在使用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()
如果数组为空则应抛出异常。这是预期的行为吗?
答案 0 :(得分:3)
你有一个SAFEARRAY的未绑定包装器,而不是一个空数组。
如果你想要一个空的SAFEARRAY,你可以声明一个:
CComSafeArray<MyStruct> array((ULONG)0);