Condividi tramite


Puntatori completi

A differenza dei puntatori univoci , i puntatori completi supportano l'aliasing. Ciò significa che più puntatori possono fare riferimento agli stessi dati, come illustrato nella figura seguente:

due puntatori che fanno riferimento agli stessi dati

Un puntatore completo presenta le caratteristiche seguenti:

  • Può avere il valore Null.
  • Può passare da Null a non Null durante la chiamata. Quando il valore viene modificato in non Null, lo stub del client alloca la nuova memoria allocata in caso di restituzione. Il programma client deve liberare questa memoria prima che venga terminata.
  • Può passare da non null a Null durante la chiamata. Quando il valore viene modificato in Null, l'applicazione è responsabile della liberazione della memoria.
  • Il valore può cambiare da un valore non Null a un altro.
  • L'archiviazione a cui punta un puntatore completo può essere accessibile da un altro puntatore o nome nell'operazione.
  • I dati restituiti vengono scritti nell'archiviazione esistente se il puntatore non ha il valore Null.

Usare l'attributo [ ptr ] per specificare un puntatore completo, come illustrato nell'esempio seguente:

/* 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);
}

In questo esempio i parametri ptrName1 e ptrName2 sono definiti come puntatori completi a una stringa. È possibile che entrambi i puntatori puntino allo stesso indirizzo di memoria contenente una singola stringa.

[ptr] è necessario quando si fornisce il supporto per l'aliasing. Tuttavia, poiché richiede la maggior parte dell'elaborazione di tutti i puntatori disponibili in RPC, non è consigliabile per la maggior parte delle applicazioni.