Jedinečné ukazatele
V programech jazyka C může více než jeden ukazatel obsahovat adresu dat. Ukazatele se označují jako vytvoření aliasu pro data. Aliasy se také vytvoří, když ukazatele ukazují na deklarované proměnné. Následující fragment kódu ilustruje obě tyto metody aliasingu:
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;
V typickém programu jazyka C můžete zadat binární strom pomocí následující definice:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
K obsahu uzlu stromu má přístup více než jeden ukazatel. To je obecně v pořádku pro aplikace bez použití. Tento styl programování však generuje složitější kód podpory RPC. Zástupné procedury klienta a serveru vyžadují další kód pro správu dat a ukazatelů. Základní kód zástupných procedur musí přeložit různé ukazatele na adresy a určit, která kopie dat představuje nejnovější verzi.
Množství zpracování lze snížit, pokud zaručujete, že ukazatel je jediný způsob, jak aplikace může přistupovat k této oblasti paměti. Ukazatel může mít stále mnoho funkcí ukazatele jazyka C. Může se například změnit mezi null ahodnotami null nebo zůstat stejné. Následující příklad to ilustruje. Ukazatel je null před voláním a odkazuje na platný řetězec po volání:
Kompilátor MIDL ve výchozím nastavení použije atribut ukazatele [ jedinečný] na všechny ukazatele, které nejsou parametry. Toto výchozí nastavení lze změnit pomocí atributu [ pointer_default].
Jedinečný ukazatel má následující vlastnosti:
- Může mít hodnotu null.
- Během volání se může změnit z null nanull. Když se hodnota změní nanull, nová paměť je přidělena při vrácení.
- Během volání se může změnit z null na null. Když se hodnota změní na null, je aplikace zodpovědná za uvolnění paměti.
- Hodnota se může změnit z jedné hodnoty, která není null, na jinou.
- Úložiště, ke kterému nelze získat přístup pomocí jiného ukazatele nebo názvu v operaci.
- Návratová data jsou zapsána do existujícího úložiště, pokud ukazatel nemá hodnotu null.
Následující příklad ukazuje, jak definovat jedinečný ukazatel.
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
V tomto příkladu je parametr jedinečným ukazatelem na znaková data odesílaná na server, který se má zpracovat pomocí rutiny RemoteFn.