Share via


Ponteiros exclusivos

Em programas C, mais de um ponteiro pode conter o endereço dos dados. Dizem que os ponteiros criam um alias para os dados. Os aliases também são criados quando 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 do cliente e do servidor exigem o código adicional para gerenciar os dados e os ponteiros. O código stub subjacente deve resolve 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 poderá ser reduzida se você garantir que o ponteiro seja 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 alterar entre valores nulos e não nulos ou permanecer o mesmo. O exemplo a seguir ilustra essa situação. O ponteiro é nulo antes da chamada e aponta para uma cadeia de caracteres válida após a chamada:

alteração de ponteiro 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 nulo.
  • Ele pode mudar de nulo para não nulo durante a chamada. Quando o valor é alterado para não nulo, a nova memória é alocada no retorno.
  • Ele pode mudar de não nulo para nulo durante a chamada. Quando o valor é alterado para NULL, 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 exclusivo aponta não pode ser acessado por nenhum 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.

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 caractere que são enviados para um servidor a serem processados com a rotina RemoteFn.