正确清理CComSafeArray <variant> </variant>

时间:2014-12-09 15:07:06

标签: com variant safearray ole-automation

假设:

{
    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发生的事情。

1 个答案:

答案 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   在每个元素上调用函数。