假设:
{
CComSafeArray<VARIANT> sa;
CComVariant ccv(L"test");
sa.Add(ccv, TRUE);
}
我希望CComSafeArray的dtor会在每个包含的成员上调用:: VariantClear,文档似乎表明:
在某些情况下,最好在不调用VariantClear的情况下清除代码中的变体。 例如,您可以将VT_I4变体的类型更改为其他类型,而无需调用此类型 功能。 BSTR的安全阵列将在每个元素上调用SysFreeString 而不是VariantClear。 但是,如果收到VT_type但无法处理,则必须调用VariantClear。的 SAFEARRAYS 变体也将在每个成员上调用VariantClear 。
(来源:http://msdn.microsoft.com/en-us/library/windows/desktop/ms221165(v=vs.85).aspx)
但我发现在atlsafe.h的代码中没有发生这样的事情。
我只是在寻找错误的地方,或者这应该是:: SafeArrayDestroy()的副作用 - 这是唯一通过CComSafeArray dtor发生的事情。
答案 0 :(得分:1)
最终VariantClear
将调用CComSafeArray对象的内容,尽管在进行多个层之后。 CComSafeArray::~CComSafeArray()
调用CComSafeArray::Destroy()
,它最终是SafeArrayDestroy()
:
HRESULT Destroy()
{
HRESULT hRes = S_OK;
if (m_psa != NULL)
{
hRes = Unlock();
if (SUCCEEDED(hRes))
{
hRes = SafeArrayDestroy(m_psa);
if (SUCCEEDED(hRes))
m_psa = NULL;
}
}
return hRes;
}
SafeArrayDestroy()
is documented as calling VariantClear
on its contents if it contains VARIANTs:
变量的安全数组将调用VariantClear函数 BSTR的每个成员和安全数组都将具有SysFreeString 在每个元素上调用函数。