Дано:
{
CComSafeArray<VARIANT> sa;
CComVariant ccv(L"test");
sa.Add(ccv, TRUE);
}
Я надеялся, что dtor CComSafeArray вызовет ::VariantClear для каждого содержащегося члена, и документация, похоже, указывает, что:
В некоторых случаях может быть предпочтительнее очистить вариант кода без вызова VariantClear. Например, вы можете изменить тип варианта VT_I4 на другой тип, не вызывая эту функцию. У Safearrays BSTR будет вызываться SysFreeString для каждого элемента, а не VariantClear. Однако вы должны вызвать VariantClear, если VT_type получен, но не может быть обработан. У Safearrays of variant также будет вызываться VariantClear для каждого члена.
(источник: http://msdn.microsoft.com/en-us/library/windows/desktop/ms221165(v=vs.85).aspx)
Но я не вижу ничего подобного в коде atlsafe.h.
Я просто ищу не в том месте или это просто должно произойти как побочный эффект ::SafeArrayDestroy() - единственное, что происходит через CComSafeArray dtor.
CComSafeArray<BSTR>::SetAt()
, но на этом микрооптимизации заканчиваются. Конечно, вы ищете не в том месте, вы не сможете увидеть исходный код SafeArrayDestroy или VariantClear, если только вы не работаете в Microsoft. - person Hans Passant   schedule 09.12.2014SafeArrayDestroy
. Он выполняет правильную очистку каждого элемента в соответствии с типом элемента. - person Igor Tandetnik   schedule 09.12.2014