ATL/COM:为什么 CComSafeArray::GetCount() 会为空数组抛出异常
ATL/COM: Why does CComSafeArray::GetCount() throw an exception for an empty array?
我正在使用 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()
应该抛出异常。这是预期的行为吗?
您有一个用于 SAFEARRAY 的未绑定包装器,而不是一个空数组。
如果你想要一个空的 SAFEARRAY,你可以声明一个:
CComSafeArray<MyStruct> array((ULONG)0);
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 对象初始化后在C++中显示 char 数组时的异常行为
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 为什么在这个动态数组中抛出异常
- ATL/COM:为什么 CComSafeArray::GetCount() 会为空数组抛出异常
- 将索引超出数组边界在 C++ 中的内核之前抛出异常或错误
- 创建2D数组时出现异常:在C++中重新抛出之前进行清理
- 有人能确切地解释一下,如果在堆上分配对象数组的过程中抛出异常,会发生什么吗
- 重载2D数组操作符并抛出异常