Implémentation du décompte de références

Le décompte de références requiert un travail sur la partie de l’implémenteur d’une classe et des clients qui utilisent des objets de cette classe. Lorsque vous implémentez une classe, vous devez implémenter les méthodes AddRef et Release dans le cadre de l’interface IUnknown . Ces deux méthodes ont les implémentations simples suivantes :

  • AddRef incrémente le décompte de références internes de l’objet.
  • Release First décrémente le décompte de références internes de l’objet, puis vérifie si le nombre de références est tombé à zéro. Si c’est le cas, cela signifie que personne n’utilise plus l’objet, donc la fonction Release libère l’objet.

Une approche d’implémentation courante pour la plupart des objets consiste à avoir une seule implémentation de ces méthodes (avec QueryInterface), qui est partagée entre toutes les interfaces et, par conséquent, un nombre de références qui s’applique à l’ensemble de l’objet. Toutefois, du point de vue du client, le décompte de références est strictement et clairement une notion par pointeur d’interface. par conséquent, les objets qui tirent parti de cette fonctionnalité en construisant, détruisant, chargent ou déchargent de façon dynamique des parties de leur fonctionnalité en fonction des pointeurs d’interface actuellement existants peuvent être implémentés. Il s’agit d' interfaces de destruction.

Chaque fois qu’un client appelle une méthode (ou une fonction API), telle que QueryInterface, qui retourne un nouveau pointeur d’interface, la méthode appelée est chargée d’incrémenter le décompte de références via le pointeur retourné. Par exemple, lorsqu’un client crée d’abord un objet, il reçoit un pointeur d’interface vers un objet qui, du point de vue du client, a un décompte de références d’un. Si le client appelle ensuite AddRef sur le pointeur d’interface, le nombre de références devient deux. Le client doit appeler Release deux fois sur le pointeur d’interface pour supprimer toutes ses références à l’objet.

Un exemple de la façon dont les décomptes de références sont strictement par pointeur d’interface se produit lorsqu’un client appelle QueryInterface sur le premier pointeur pour une nouvelle interface ou la même interface. Dans l’un ou l’autre de ces cas, le client doit appeler une fois la mise en sortie pour chaque pointeur. COM ne requiert pas qu’un objet retourne le même pointeur lorsqu’il demande plusieurs fois la même interface. (La seule exception est une requête vers IUnknown, qui identifie un objet à com.) Cela permet à l’implémentation d’objet de gérer efficacement les ressources.

La sécurité des threads est également un problème important dans l’implémentation de AddRef et Release. Pour plus d’informations, consultez processus, threads et Apartments.

Gestion des durées de vie des objets via le décompte de références