ATL::CComVariant
a a handful of assignment operators. Ce que je vois dans la mise en œuvre est que dans les opérateurs d'affectation acceptant LPCOLESTR
, IUnknown*
ou IDispatch*
la première action est d'appeler Clear()
.Est-ce un bogue d'auto-affectation dans ATL :: CComVariant?
Si l'opérateur a invoqué de telle sorte qu'une variable membre du même objet est passé
CComVariant variant;
variant = L"string";
variant = variant.bstrVal;
(il sont des moyens moins muets qui auront le même effet) Clear()
va libérer l'objet encapsulé et toutes les actions ultérieures sur le pointeur qui se balance maintenant entraîneront un comportement indéfini.
Suis-je correct ou ai-je mal compris quelque chose?
Cela ressemble à un bug. Ceux-ci doivent être traités avec plus de précaution en cas de paramètre "aliasing". Première copie locale ('AddRef' /' SysAllocString'), puis 'Clear', puis transfert de propriété. – wqw
@wqw: De quel alias parlez-vous? Est-ce que la comparaison du pointeur de magasin avec le pointeur n'est pas juste pour assigner pas assez? – sharptooth