atributo force_allocate
El atributo ACF [force_allocate] obliga a asignar un parámetro de puntero mediante midl_user_allocate en lugar de optimizar la asignación.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ force_allocate [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Parámetros
Este atributo no tiene parámetros.
Observaciones
RPC intenta minimizar las asignaciones de memoria en el servidor proporcionando punteros a búferes de memoria internos. Este enfoque puede causar problemas para las aplicaciones que intentan llamar directamente a midl_user_free en punteros proporcionados por RPC, ya que no se puede liberar un puntero optimizado. Marcar un parámetro con [force_allocate] impedirá esta optimización para todos los punteros que lo deriven.
Otro uso común para [force_allocate] es garantizar la alineación de la memoria a la que se apunta si una aplicación requiere una alineación mayor que la de la memoria a la que apunta. Por ejemplo, las aplicaciones suelen pasar datos en una matriz genérica de bytes en lugar de usar el tipo real, pero solo se garantiza que un byte esté alineado en 1, lo que puede causar problemas para las aplicaciones que asumen una alineación mayor. Al marcar el parámetro con [force_allocate], la aplicación puede garantizar que toda la memoria a la que apunta tendrá una alineación igual a la garantizada por midl_user_allocate.
Ejemplos
/* IDL file */
void Func1([in, out, string] char **ppstr);
void Func2([in] long s, [in, size_is(s)] byte *pData);
/* ACF file */
/* e.g. The application wishes to call midl_user_free on *ppstr and supply a new pointer */
Func1([force_allocate] pstr);
/* e.g. pData really points to a structure that needs an alignment greater than 1 */
Func2([force_allocate] pData);
Vea también