Eindeutige Zeiger
In C-Programmen kann mehr als ein Zeiger die Adresse der Daten enthalten. Die Zeiger sollen einen Alias für die Daten erstellen. Aliase werden auch erstellt, wenn Zeiger auf deklarierte Variablen zeigen. Das folgende Codefragment veranschaulicht die beiden Methoden des Aliasings:
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;
In einem typischen C-Programm können Sie eine binäre Struktur mithilfe der folgenden Definition angeben:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
Mehrere Zeiger können auf den Inhalt eines Strukturknotens zugreifen. Dies ist in der Regel für nicht verteilte Anwendungen in Ordnung. Diese Art der Programmierung generiert jedoch komplizierteren RPC-Unterstützungscode. Die Client- und Serverstubs benötigen den zusätzlichen Code, um die Daten und zeiger zu verwalten. Der zugrunde liegende Stubcode muss die verschiedenen Zeiger auf die Adressen auflösen und bestimmen, welche Kopie der Daten die neueste Version darstellt.
Der Verarbeitungsaufwand kann reduziert werden, wenn Sie garantieren, dass Ihr Zeiger die einzige Möglichkeit ist, auf diesen Speicherbereich zuzugreifen. Der Zeiger kann weiterhin viele Features eines C-Zeigers aufweisen. Sie kann beispielsweise zwischen NULL - und Ungleich-NULL-Werten wechseln oder gleich bleiben. Dies wird anhand des folgenden Beispiels veranschaulicht. Der Zeiger ist vor dem Aufruf NULL und zeigt auf eine gültige Zeichenfolge nach dem Aufruf:
Standardmäßig wendet der MIDL-Compiler das Zeiger-Attribut [ eindeutig] auf alle Zeiger an, die keine Parameter sind. Diese Standardeinstellung kann mit dem Attribut [ pointer_default] geändert werden.
Ein eindeutiger Zeiger weist die folgenden Merkmale auf:
- Sie kann den Wert NULL aufweisen.
- Er kann während des Aufrufs von NULL in ungleich NULL geändert werden. Wenn sich der Wert in ungleich NULL ändert, wird bei der Rückgabe neuer Arbeitsspeicher zugewiesen.
- Sie kann während des Aufrufs von ungleich NULL in NULL geändert werden. Wenn sich der Wert in NULL ändert, ist die Anwendung für die Freigabe des Arbeitsspeichers verantwortlich.
- Der Wert kann von einem Wert ungleich NULL in einen anderen geändert werden.
- Auf den Speicher, auf den ein eindeutiger Zeiger verweist, kann kein anderer Zeiger oder Name im Vorgang zugreifen.
- Rückgabedaten werden in vorhandenen Speicher geschrieben, wenn der Zeiger nicht über den Wert NULL verfügt.
Im folgenden Beispiel wird veranschaulicht, wie ein eindeutiger Zeiger definiert wird.
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
In diesem Beispiel ist der Parameter ach ein eindeutiger Zeiger auf Zeichendaten, die an einen Server gesendet werden, der mit der RemoteFn-Routine verarbeitet werden soll.