Ponteiros Únicos

Em programas C, mais de um ponteiro pode conter o endereço de dados. Diz-se que os ponteiros criam um alias para os dados. Os aliases também são criados quando os ponteiros apontam para variáveis declaradas. O fragmento de código a seguir ilustra ambos os métodos de aliasing:

int iAnInteger=50;

// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;

// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;

Em um programa C típico, você pode especificar uma árvore binária usando a seguinte definição:

typedef struct _treetype 
{
    long               lValue;
    struct _treetype * left;
    struct _treetype * right;
} TREETYPE;

TREETYPE * troot;

Mais de um ponteiro pode acessar o conteúdo de um nó de árvore. Isso geralmente é bom para aplicativos não distribuídos. No entanto, esse estilo de programação gera um código de suporte RPC mais complicado. Os stubs de cliente e servidor exigem o código adicional para gerenciar os dados e os ponteiros. O código de stub subjacente deve resolver os vários ponteiros para os endereços e determinar qual cópia dos dados representa a versão mais recente.

A quantidade de processamento pode ser reduzida se você garantir que seu ponteiro é a única maneira de o aplicativo acessar essa área de memória. O ponteiro ainda pode ter muitos dos recursos de um ponteiro C. Por exemplo, ele pode mudar entre valores denulos e não nulos ou permanecer os mesmos. O exemplo a seguir ilustra isso. O ponteiro é nulo antes da chamada e aponta para uma cadeia de caracteres válida após a chamada:

ponteiro alterando entre valores nulos e não nulos

Por padrão, o compilador MIDL aplica o atributo de ponteiro [ exclusivo] a todos os ponteiros que não são parâmetros. Essa configuração padrão pode ser alterada com o atributo [ pointer_default].

Um ponteiro exclusivo tem as seguintes características:

  • Ele pode ter o valor null.
  • Ele pode mudar de nulo paranulo não durante a chamada. Quando o valor muda paranulo não, nova memória é alocada no retorno.
  • Ele pode mudar denulo não para nulo durante a chamada. Quando o valor muda para NULL , o aplicativo é responsável por liberar a memória.
  • O valor pode mudar de um valor denulo não para outro.
  • O armazenamento para o qual um ponteiro exclusivo aponta não pode ser acessado por nenhum outro ponteiro ou nome na operação.
  • Os dados de retorno são gravados no armazenamento existente se o ponteiro não tiver o valor null.

O exemplo a seguir demonstra como definir um ponteiro exclusivo.

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

Neste exemplo, o parâmetro ach é um ponteiro exclusivo para dados de caracteres que são enviados a um servidor para serem processados com a rotina RemoteFn.