Pointeurs complets

Contrairement aux pointeurs uniques , les pointeurs complets prennent en charge l’aliasing. 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 :

  • Il peut avoir la valeur null.
  • Il peut passer de null à non null pendant l’appel. Lorsque la valeur devient non null, le stub client alloue une nouvelle mémoire allouée au retour. Le programme client doit libérer cette mémoire avant sa fin.
  • Il peut passer de non null à null pendant l’appel. Lorsque la valeur passe à null, l’application est responsable de libérer la mémoire.
  • La valeur peut passer d’une valeur non null à une autre.
  • Le stockage vers lequel pointe un pointeur complet est accessible par un autre pointeur ou nom dans l’opération.
  • Les données de retour sont écrites dans le 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 en tant que pointeurs complets vers une chaîne. Il est possible pour les deux pointeurs de pointer vers la même adresse mémoire contenant une chaîne unique.

[ptr] est requis lors de la prise en charge de l’aliasing. 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.