attribut d’allocation
L’attribut ACF [allouer] vous permet de personnaliser l’allocation et la désallocation de mémoire pour un type défini dans le fichier IDL.
typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
-
allocate-option-list
-
Spécifie une ou plusieurs options d’allocation de mémoire. Sélectionnez l’une des single_node ou all_nodes, ou l’une des dont_free libres ou dont_free, ou une de chaque paire. Lorsque vous spécifiez plusieurs options, séparez les options par des virgules.
-
type-attribute-list
-
Spécifie d’autres attributs de type ACF facultatifs. Lorsque vous spécifiez plusieurs attributs de type, séparez les options par des virgules.
-
type-name
-
Spécifie un type défini dans le fichier IDL.
L’attribut [allocate] a les options valides suivantes.
Option | Description |
---|---|
all_nodes | Effectue un appel pour allouer et libérer de la mémoire pour tous les nœuds. |
single_node | Effectue de nombreux appels individuels pour allouer et libérer chaque nœud de mémoire. |
free | Libère de la mémoire au retour du stub du serveur. |
dont_free | Ne libère pas de mémoire au retour du stub du serveur. |
Par défaut, les stubs peuvent allouer du stockage pour les données référencées par un pointeur unique ou complet en appelant midl_user_allocate et midl_user_free individuellement pour chaque pointeur.
Vous pouvez optimiser la vitesse de votre application en spécifiant l’option all_nodes. Cette option indique au stub de calculer la taille de toute la mémoire référencée via le pointeur du type spécifié et d’effectuer un seul appel à midl_user_allocate. Le stub libère la mémoire en effectuant un appel à midl_user_free.
L’option dont_free indique au compilateur MIDL de générer un stub de serveur qui n’appelle pas midl_user_free pour le type spécifié. L’option dont_free permet aux structures de pointeur de rester accessibles à l’application serveur une fois l’appel de procédure distante terminé et retourné au client.
L’attribut [allocate] entraîne la réaffectation de la mémoire à un paramètre [in, out] qui est un pointeur vers un type qualifié avec l’option all_nodes . Il incombe à l’application de libérer la mémoire allouée précédemment pour ce paramètre. Exemple :
typedef struct thistype
{
[string] char * PTHISTYPE;
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);
Le type de données PTHISTYPE est réaffecté dans la direction [out] par le stub avant le démarshalage. Par conséquent, l’application doit libérer la mémoire qu’elle a précédemment allouée pour les données de ce paramètre, sinon une fuite de mémoire se produit.
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;