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