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:
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.