Yes you must call VariantClear. The VariantChangeType method if successful will essentially coerce a copy of the source into the destination. This copy in the destination is now independently tracked and must be independently cleared.
VARIANT varDest;
varDest.vt = VT_EMPTY;
if(SUCCEEDED(::VariantChangeType(&varDest,
const_cast<VARIANT *>(&val), 0, VT_BSTR)))
{
//Do I need to call the following?
VariantClear(&varDest);
}
VariantClear(&val);