Ne pas utiliser les types de wrapper RAII pour les objets COM. En particulier, ne pas utiliser CComPtr<>
, CComBSTR
y CComVARIANT<>
. Ces objets aide prévenir les fuites en retirant au développeur la responsabilité de libérer la ressource sous-jacente. L'objet enveloppant impose la libération des ressources dans son destructeur.
Une autre cause de fuites ou de libérations accidentelles que j'ai observée est le résultat de la conversion implicite de la fonction CComPtr<T>
a T*
. Ceci est utile pour passer des objets enveloppés comme arguments. Mais elle peut poser des problèmes car elle permet la conversion implicite entre un objet RAII et un pointeur brut. Par exemple
CComPtr<IFoo> GetAFoo(); // Imagine if this creates the object
...
IFoo* pFoo = GetAFoo();
pFoo->SomeCall();
L'appel à SomeCall échouera probablement dans ce scénario car l'objet pFoo est mort à ce stade. Pourquoi ? La valeur a été renvoyée avec un compte de référence de 1 par GetAFoo, affectée à pFoo, puis décrémentée à 0 et supprimée parce que la valeur temporaire est sortie de la portée.