Partager via


Règles de gestion de la mémoire

La durée de vie des pointeurs vers les interfaces est toujours gérée via les méthodes AddRef et Release sur chaque interface COM. Pour plus d’informations, consultez Règles de gestion des nombres de références.

Pour tous les autres paramètres, il est important de respecter certaines règles pour gérer la mémoire. Les règles suivantes s’appliquent à tous les paramètres des méthodes d’interface, valeur de retour comprise, qui ne sont pas transmis par valeur :

  • Les paramètres entrants doivent être alloués et libérés par l’appelant.
  • Les paramètres sortants doivent être alloués par l’appelé ; ils sont libérés par l’appelant à l’aide de l’allocateur de mémoire de tâche COM standard. Pour plus d’informations, consultez Allocateur de mémoire OLE.
  • Les paramètres entrants/sortants sont initialement alloués par l’appelant, puis libérés et réalloués par l’appelé, si nécessaire. Tout comme pour les paramètres sortants, l’appelant est chargé de libérer la valeur retournée finale. L’allocateur de mémoire COM standard doit être utilisé.

Dans les deux derniers cas, où un élément de code alloue la mémoire et un autre élément de code la libère, l’utilisation de l’allocateur COM garantit que les deux éléments de code utilisent les mêmes méthodes d’allocation.

Un autre domaine qui demande une attention particulière est le traitement des paramètres sortants et entrants-sortants dans des conditions d’échec. Si une fonction retourne un code d’échec, l’appelant n’a généralement aucun moyen de nettoyer les paramètres sortants ou entrants-sortants. Cela aboutit aux règles supplémentaires suivantes :

  • En cas de condition d’erreur, les paramètres doivent toujours être définis de manière fiable sur une valeur qui sera nettoyée sans aucune action de l’appelant.
  • Tous les paramètres de pointeur sortants doivent être définis explicitement sur NULL. Ils sont généralement transmis dans un paramètre pointeur à pointeur, mais peuvent également être transmis en tant que membres d’une structure que l’appelant alloue et que le code appelé remplit. Le moyen le plus simple de garantir ceci est (en partie) de définir ces valeurs sur NULL lors de l’entrée de la fonction. Cette règle est importante parce qu’elle favorise une interopérabilité plus robuste des applications.
  • Dans des conditions d’erreur, tous les paramètres entrants-sortants doivent être laissés tels quels par le code appelé (gardant ainsi la valeur avec laquelle ils ont été initialisés par l’appelant) ou être explicitement définis, comme dans le cas d’un retour d’erreur de paramètre sortant.

N’oubliez pas que ces conventions de gestion de la mémoire pour les applications COM s’appliquent uniquement aux interfaces et API publiques ; il n’est pas nécessaire que l’allocation de mémoire strictement interne à une application COM soit effectuée à l’aide de ces mécanismes.

COM utilise en interne des appels de procédure distante (RPC) pour communiquer entre les clients et les serveurs. Pour plus d’informations sur la gestion de la mémoire dans les stubs de serveur RPC, consultez la rubrique Gestion de la mémoire des stubs de serveur.