Ponteiros Completos
Ao contrário ponteiros de exclusivos, ponteiros completos dão suporte ao aliasing. Isso significa que vários ponteiros podem se referir aos mesmos dados, conforme mostrado na figura a seguir:
Um ponteiro completo tem as seguintes características:
- Ele pode ter o valor nulo.
- Ele pode mudar de nulo para não nulo durante a chamada. Quando o valor é alterado para não nulo, o stub do cliente aloca nova memória alocada no retorno. O programa cliente deve liberar essa memória antes de terminar.
- Ele pode mudar de não nulo para nulo durante a chamada. Quando o valor é alterado para nulo, o aplicativo é responsável por liberar a memória.
- O valor pode ser alterado de um valor não nulo para outro.
- O armazenamento para o qual um ponteiro completo aponta pode ser acessado por outro ponteiro ou nome na operação.
- Os dados de retorno serão gravados no armazenamento existente se o ponteiro não tiver o valor nulo.
Use o atributo [ ptr ] para especificar um ponteiro completo, conforme mostrado no exemplo a seguir:
/* 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);
}
Neste exemplo, os parâmetros ptrName1 e ptrName2 são definidos como ponteiros completos para uma cadeia de caracteres. É possível que ambos os ponteiros apontem para o mesmo endereço de memória que contém uma única cadeia de caracteres.
[ptr] é necessário ao fornecer suporte de aliasing. No entanto, como ele requer o maior processamento de todos os ponteiros disponíveis no RPC, ele não é recomendado para a maioria dos aplicativos.