Punteros completos
A diferencia de los punteros únicos , los punteros completos admiten el alias. Esto significa que varios punteros pueden hacer referencia a los mismos datos, como se muestra en la ilustración siguiente:
Un puntero completo tiene las siguientes características:
- Puede tener el valor NULL.
- Puede cambiar de null a no null durante la llamada. Cuando el valor cambia a distinto de NULL, el código auxiliar del cliente asigna una nueva memoria asignada al devolver. El programa cliente debe liberar esta memoria antes de que finalice.
- Puede cambiar de distinto de NULL a NULL durante la llamada. Cuando el valor cambia a NULL, la aplicación es responsable de liberar la memoria.
- El valor puede cambiar de un valor distinto de NULL a otro.
- El almacenamiento al que apunta un puntero completo puede ser accedido por otro puntero o nombre en la operación.
- Los datos devueltos se escriben en el almacenamiento existente si el puntero no tiene el valor NULL.
Use el atributo [ ptr ] para especificar un puntero completo, como se muestra en el ejemplo siguiente:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface FullPtrInterface
{
void RemoteFn([in,ptr,string]) char *ptrName1,
[in,ptr,string] char *ptrName2);
}
En este ejemplo, los parámetros ptrName1 y ptrName2 se definen como punteros completos a una cadena. Es posible que ambos punteros apunten a la misma dirección de memoria que contiene una sola cadena.
[ptr] es necesario al proporcionar compatibilidad con alias. Sin embargo, dado que requiere el mayor procesamiento de todos los punteros disponibles en RPC, no se recomienda para la mayoría de las aplicaciones.