Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
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.