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;

Paramètres

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.

Notes

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.

Exemples

/* ACF file */ 
typedef [allocate(all_nodes, dont_free)] PTYPE1; 
typedef [allocate(all_nodes)] PTYPE2; 
typedef [allocate(dont_free)] PTYPE3;

Voir aussi

Fichier de configuration d’application (ACF)

Dans

midl_user_allocate

midl_user_free

out

Typedef