给予:
{
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发生的唯一一件事。
发布于 2015-06-05 06:04:48
最终,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;
}on its contents if it contains VARIANTs
变量的安全数组将在每个成员上调用VariantClear函数,而BSTR的安全数组将在每个元素上调用SysFreeString函数。
https://stackoverflow.com/questions/27382144
复制相似问题