Resumen de las reglas de asignación de memoria
En la tabla siguiente se resumen las reglas clave relativas a la asignación de memoria.
Elemento MIDL | Descripción |
---|---|
Punteros de nivel superior [ ref] | Debe ser punteros no NULL. |
Valor devuelto de la función | La nueva memoria siempre se asigna para los valores devueltos del puntero. |
[ unique, out] o [ ptr, out] puntero | No permitido por MIDL. |
Puntero que no es de nivel superior [unique, in, out] o [ptr, in, out] que cambia de null a no null | Los códigos auxiliares de cliente asignan memoria nueva en el cliente a cambio. |
Puntero que no es de nivel superior [unique, in, out] que cambia de distinto de null a NULL | La memoria está huérfana en el cliente; la aplicación cliente es responsable de liberar memoria y evitar fugas. |
Puntero que no es de nivel superior [ptr, in, out] que cambia de distinto de null a NULL | La memoria será huérfana en el cliente si no tiene alias; la aplicación cliente es responsable de liberar y evitar fugas de memoria en este caso. |
Punteros [ref] | Normalmente, la capa de aplicación cliente asigna. |
Puntero que no es null [in, out] | Los códigos auxiliares intentan escribir en el almacenamiento existente en el cliente. Si [cadena] y el tamaño aumentan más allá del tamaño asignado en el cliente, provocará un error de GP en la devolución. |
En la tabla siguiente se resumen los efectos de los atributos IDL y ACF clave en la administración de memoria.
Característica MIDL | Problemas del cliente | Problemas del servidor |
---|---|---|
[ allocate(single_node)], [allocate(all_nodes)] | Determina si se realizan una o varias llamadas a las funciones de memoria. | Igual que el cliente, excepto la memoria privada, se puede usar a menudo para asignar (single_node) [in] y [in,out] datos. |
[allocate(free)] o [allocate(dont_free)] | (Ninguno; afecta al servidor). | Determina si la memoria del servidor se libera después de cada llamada a procedimiento remoto. |
atributos de matriz [ max_is] y [ size_is] | (Ninguno; afecta al servidor). | Determina el tamaño de la memoria que se va a asignar. |
[ byte_count] | El cliente debe asignar búfer; no asignado o liberado por códigos auxiliares de cliente. | El atributo de parámetro ACF determina el tamaño del búfer asignado en el servidor. |
[ enable_allocate] | Normalmente, ninguno. Sin embargo, el cliente puede usar un entorno de administración de memoria diferente. | El servidor usa un entorno de administración de memoria diferente. RpcSmAllocate debe usarse para las asignaciones. |
[ in]attribute | Aplicación cliente responsable de asignar memoria para los datos. | Asignado en el servidor por códigos auxiliares. |
Atributo [ out] | Asignado en el cliente por códigos auxiliares. | [out]-only puntero debe ser [ref] puntero; asignados en el servidor por códigos auxiliares. |
Atributo [ ref] | La aplicación cliente debe asignar la memoria a la que hace referencia el puntero. | Punteros de referencia de nivel superior y de primer nivel administrados por códigos auxiliares. |
Atributo [ unique] | Un valor distinto de NULL a NULL puede dar lugar a memoria huérfana; null a no null hace que el código auxiliar del cliente llame a midl_user_allocate. | (Afecta al cliente). |
Atributo [ ptr] | (Consulte [ unique].) | (Consulte [ unique].) |