【发布时间】: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() 调用都需要调整数组的大小。你应该指定你需要的界限。请记住,数组不是向量。