asignar atributo
El atributo ACF [allocate] permite personalizar la asignación y desasignación de memoria para un tipo definido en el archivo IDL.
typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
-
allocate-option-list
-
Especifica una o varias opciones de asignación de memoria. Seleccione uno de single_node o all_nodes, o bien uno de los dont_free o uno de cada par. Al especificar más de una opción, separe las opciones con comas.
-
type-attribute-list
-
Especifica otros atributos opcionales de tipo ACF. Al especificar más de un atributo de tipo, separe las opciones con comas.
-
type-name
-
Especifica un tipo definido en el archivo IDL.
El atributo [allocate] tiene las siguientes opciones válidas.
Opción | Descripción |
---|---|
all_nodes | Realiza una llamada para asignar y liberar memoria para todos los nodos. |
single_node | Realiza muchas llamadas individuales para asignar y liberar cada nodo de memoria. |
free | Libera memoria devuelta desde el código auxiliar del servidor. |
dont_free | No libera memoria devuelta desde el código auxiliar del servidor. |
De forma predeterminada, los códigos auxiliares pueden asignar almacenamiento para los datos a los que hace referencia un puntero único o completo llamando a midl_user_allocate y midl_user_free individualmente para cada puntero.
Puede optimizar la velocidad de la aplicación especificando la opción all_nodes. Esta opción dirige el código auxiliar para calcular el tamaño de toda la memoria a la que se hace referencia a través del puntero del tipo especificado y para realizar una sola llamada a midl_user_allocate. El código auxiliar libera la memoria realizando una llamada a midl_user_free.
La opción dont_free dirige al compilador MIDL para generar un código auxiliar del servidor que no llama a midl_user_free para el tipo especificado. La opción dont_free permite que las estructuras de puntero permanezcan accesibles para la aplicación de servidor después de que la llamada al procedimiento remoto se haya completado y devuelto al cliente.
El atributo [allocate] hará que cualquier parámetro [in, out] que sea un puntero a un tipo calificado con la opción all_nodes reasignar la memoria cuando los datos no están separados. Es responsabilidad de la aplicación liberar la memoria asignada anteriormente para este parámetro. Por ejemplo:
typedef struct thistype
{
[string] char * PTHISTYPE;
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);
El tipo de datos PTHISTYPE se reasignará en la dirección [out] mediante el código auxiliar antes de desmarizar. Por lo tanto, la aplicación debe liberar la memoria asignada previamente para los datos de este parámetro o se producirá una fuga de memoria.
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;