COM : _com_ptr_t ca marche mais je ne comprend pas pourquoi
Bonjour
Je dévellope depuis peu en utilisant la technologie COM. J'ai découvert récemment la possibilité d'utiliser des wrappers avec gestion d'erreurs de haut niveau et les smart pointers de visual c++ (j'utilisait les CComPtr ATL précédemment).
Cependant je ne comprend pas pourquoi les _com_ptr_t ne font pas de AddRef de trop quand on les assignent avec l'opérateur =.
Ainsi auparavant je réalisais ceci :
Code:
1 2 3
| //on suppose que aPtr est un pointeur initialisé sur un autre objet d'une API
CComPtr<IB> bPtr
aPtr->GetSubObject(&bPtr); |
Dans ce cas l'appel à GetSubObject réalisait un increment de reference (comme toutes les méthodes d'API retournant une interface). L'opérateur & de CComPtr m'assurait qu'il en réalisait pas d'autres AddRef. l'appel à Release était automatique en fin de portée.
Avec les _com_ptr_t et wrapper de méthodes :
Code:
1 2
| IBPtr bPtr;
bPtr= aPtr->GetSubObject(); |
Le probléme c'est que au cours de l'appel à l'opérateur =, un addRef est effectué (j'ai vérifié en Debug). Or le compteur de référence se trouve à 1 aprés cette ligne. Il devrais être à 2 (AddRef par l'api plus AddRef dans l'opérateur =).
Ca marche c'est cool, mais je voudrais savoir pourquoi (release dans le wrapper ?), et être sur que ca marche.
Merci d'avance