2

鉴于:

{
    CComSafeArray<VARIANT> sa;
    CComVariant ccv(L"test");
    sa.Add(ccv, TRUE);
}

我希望 CComSafeArray 的 dtor 会在每个包含的成员上调用 ::VariantClear 并且文档似乎表明:

在某些情况下,最好在不调用 VariantClear 的情况下清除代码中的变体。例如,您可以将 VT_I4 变体的类型更改为另一种类型,而无需调用此函数。BSTR 的 Safearrays 将在每个元素上调用 SysFreeString,而不是 VariantClear。但是,如果收到 VT_type 但无法处理,则必须调用 VariantClear。变体的安全数组也将对每个成员调用 VariantClear

(来源: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms221165 (v=vs.85).aspx )

但是我在 atlsafe.h 的代码中没有看到这样的事情发生。

我只是在错误的地方寻找,还是这只是作为 ::SafeArrayDestroy() 的副作用而发生的——这是唯一通过 CComSafeArray dtor 发生的事情。

4

1 回答 1

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()如果它包含 VARIANTs ,则记录为调用VariantClear其内容

变体的安全数组将对每个成员调用 VariantClear 函数,而 BSTR 的安全数组将对每个元素调用 SysFreeString 函数。

于 2015-06-05T06:04:48.573 回答