Unikatowe wskaźniki
W programach języka C więcej niż jeden wskaźnik może zawierać adres danych. Wskaźniki służą do tworzenia aliasu danych. Aliasy są również tworzone, gdy wskaźniki wskazują zadeklarowane zmienne. Poniższy fragment kodu ilustruje obie te metody aliasowania:
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;
W typowym programie języka C można określić drzewo binarne przy użyciu następującej definicji:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
Więcej niż jeden wskaźnik może uzyskać dostęp do zawartości węzła drzewa. Ogólnie jest to w porządku w przypadku aplikacji niedystrybucyjnych. Jednak ten styl programowania generuje bardziej skomplikowany kod obsługi RPC. Wycinki klienta i serwera wymagają dodatkowego kodu do zarządzania danymi i wskaźnikami. Podstawowy kod wycinkowy musi rozpoznać różne wskaźniki do adresów i określić, która kopia danych reprezentuje najnowszą wersję.
Ilość przetwarzania można zmniejszyć, jeśli gwarantujesz, że wskaźnik jest jedynym sposobem, w jaki aplikacja może uzyskać dostęp do tego obszaru pamięci. Wskaźnik może nadal mieć wiele funkcji wskaźnika C. Może na przykład zmieniać się między wartościami o wartościach null i innymi niżwartościami null lub zachować te same wartości. Poniższy przykład ilustruje to. Wskaźnik jest null przed wywołaniem i wskazuje prawidłowy ciąg po wywołaniu:
Domyślnie kompilator MIDL stosuje atrybut wskaźnika [ unikatowy] do wszystkich wskaźników, które nie są parametrami. To ustawienie domyślne można zmienić za pomocą atrybutu [ pointer_default].
Unikatowy wskaźnik ma następujące cechy:
- Może mieć wartość null.
- Może ona ulec zmianie z o wartości null nanull podczas wywołania. Gdy wartość zmieni się na wartość inną niżnull, nowa pamięć zostanie przydzielona po powrocie.
- Może ona ulec zmianie zo wartości null na null podczas wywołania. Gdy wartość zmieni się na NULL, aplikacja jest odpowiedzialna za zwalnianie pamięci.
- Wartość może zmieniać się z jednej wartości innej niżnull.
- Magazyn, do którego wskazuje unikatowy wskaźnik, nie może uzyskać dostępu do żadnego innego wskaźnika ani nazwy w operacji.
- Zwracane dane są zapisywane w istniejącym magazynie, jeśli wskaźnik nie ma wartości wartości null.
W poniższym przykładzie pokazano, jak zdefiniować unikatowy wskaźnik.
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
W tym przykładzie parametr jest unikatowym wskaźnikiem do danych znaków wysyłanych do serwera do przetworzenia za pomocą procedury RemoteFn.