Compartilhar via


Ponteiros Completos

Ao contrário dos ponteiros exclusivos , os 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:

dois ponteiros que fazem referência aos mesmos dados

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 mudar 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 para 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.