Pointeurs complets

Contrairement à pointeurs uniques, les pointeurs complets prennent en charge l’alias. Cela signifie que plusieurs pointeurs peuvent faire référence aux mêmes données, comme illustré dans la figure suivante :

deux pointeurs référençant les mêmes données

Un pointeur complet présente les caractéristiques suivantes :

  • Elle peut avoir la valeur Null.
  • Elle peut passer de null à non null pendant l’appel. Lorsque la valeur passe à non null, le stub client alloue une nouvelle mémoire allouée lors du retour. Le programme client doit libérer cette mémoire avant qu’elle ne se termine.
  • Il peut passer de non null à null pendant l’appel. Lorsque la valeur passe à null, l’application est chargée de libérer la mémoire.
  • La valeur peut passer d’une valeur non null à une autre.
  • Stockage auquel un pointeur complet pointe peut être accessible par un autre pointeur ou un autre nom dans l’opération.
  • Les données de retour sont écrites dans un stockage existant si le pointeur n’a pas la valeur Null.

Utilisez l’attribut [ ptr ] pour spécifier un pointeur complet, comme illustré dans l’exemple suivant :

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface FullPtrInterface
{
  void RemoteFn([in,ptr,string]) char *ptrName1,
                [in,ptr,string]  char *ptrName2);
}

Dans cet exemple, les paramètres ptrName1 et ptrName2 sont définis comme pointeurs complets vers une chaîne. Il est possible que les deux pointeurs pointent vers la même adresse mémoire contenant une seule chaîne.

[ptr] est nécessaire lors de la prise en charge des alias. Toutefois, étant donné qu’il nécessite le plus de traitement de tous les pointeurs disponibles dans RPC, il n’est pas recommandé pour la plupart des applications.