Auf Englisch lesen

Teilen über


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 beide 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 mit 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. Der Client- und Server-Stubs erfordern den zusätzlichen Code zum Verwalten der Daten und der Zeiger. Der zugrunde liegende Stubcode muss die verschiedenen Zeiger auf die Adressen auflösen und bestimmen, welche Kopie der Daten die neueste Version darstellt.

Die Verarbeitung kann reduziert werden, wenn Sie garantieren, dass der Zeiger nur auf diesen Speicherbereich zugreifen kann. Der Zeiger kann immer noch viele der Features eines C-Zeigers aufweisen. Sie kann z. B. zwischen NULL- und nicht-null- Werten ändern oder gleich bleiben. Im folgenden Beispiel wird dies veranschaulicht. Der Zeiger ist NULL- vor dem Aufruf und zeigt auf eine gültige Zeichenfolge nach dem Aufruf:

Zeiger zwischen Null- und Nicht-Null-Werten

Standardmäßig wendet der MIDL-Compiler das [ eindeutige] Zeiger-Attribut 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:

  • Er kann den Wert NULL-haben.
  • Sie kann während des Aufrufs von NULL- in nichtNULL- ändern. Wenn sich der Wert in "Nicht-null"ändert, wird beim Zurückgeben neuer Speicher zugewiesen.
  • Sie kann sich während des Aufrufs von nicht-NULL- in NULL- ändern. Wenn sich der Wert in NULL-ändert, ist die Anwendung dafür verantwortlich, den Arbeitsspeicher freizugeben.
  • Der Wert kann von einem Wert ohnenull in einen anderen geändert werden.
  • Auf den Speicher, auf den ein eindeutiger Zeiger verweist, kann von einem anderen Zeiger oder Namen im Vorgang nicht zugegriffen werden.
  • Rückgabedaten werden in vorhandenen Speicher geschrieben, wenn der Zeiger nicht den Wert NULL-hat.

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.