首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确清除CComSafeArray<VARIANT>

正确清除CComSafeArray<VARIANT>
EN

Stack Overflow用户
提问于 2014-12-09 15:07:05
回答 1查看 1.5K关注 0票数 2

给予:

代码语言:javascript
复制
{
    CComSafeArray<VARIANT> sa;
    CComVariant ccv(L"test");
    sa.Add(ccv, TRUE);
}

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

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

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

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

我只是看错了地方,还是认为这是::SafeArrayDestroy()的副作用--这是通过CComSafeArray dtor发生的唯一一件事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-05 06:04:48

最终,VariantClear将被调用到CComSafeArray对象的内容上,尽管是在经过多个层之后。CComSafeArray::~CComSafeArray()调用CComSafeArray::Destroy(),它最终是SafeArrayDestroy()的包装器。

代码语言:javascript
复制
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;
}

on its contents if it contains VARIANTs

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27382144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档