Dela via


Unika pekare

I C-program kan mer än en pekare innehålla dataadressen. Pekarna sägs skapa ett alias för data. Alias skapas också när pekare pekar på deklarerade variabler. Följande kodfragment illustrerar båda dessa aliasmetoder:

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;

I ett typiskt C-program kan du ange ett binärt träd med hjälp av följande definition:

typedef struct _treetype 
{
    long               lValue;
    struct _treetype * left;
    struct _treetype * right;
} TREETYPE;

TREETYPE * troot;

Mer än en pekare kan komma åt innehållet i en trädnod. Detta är vanligtvis bra för icke-distribuerade program. Den här programmeringsstilen genererar dock mer komplicerad RPC-stödkod. Klient- och serverstubbarna kräver ytterligare kod för att hantera data och pekare. Den underliggande stub-koden måste matcha de olika pekarna till adresserna och avgöra vilken kopia av data som representerar den senaste versionen.

Mängden bearbetning kan minskas om du garanterar att pekaren är det enda sättet för programmet att komma åt det området med minne. Pekaren kan fortfarande ha många av funktionerna i en C-pekare. Det kan till exempel ändras mellan null- och icke-null-värden eller förbli detsamma. I följande exempel visas detta. Pekaren är null- innan anropet och pekar på en giltig sträng efter anropet:

pekaren ändras mellan null- och icke-null-värden

Som standard tillämpar MIDL-kompilatorn pekarattributet [ unika] på alla pekare som inte är parametrar. Den här standardinställningen kan ändras med attributet [ pointer_default] .

En unik pekare har följande egenskaper:

  • Det kan ha värdet null.
  • Den kan ändras från null- till icke-null- under anropet. När värdet ändras till icke-null-allokeras nytt minne vid retur.
  • Den kan ändras frånsom inte är null till null- under anropet. När värdet ändras till NULL-ansvarar programmet för att frigöra minnet.
  • Värdet kan ändras från ett icke-null- värde till ett annat.
  • Lagringen som en unik pekare pekar på inte kan nås av någon annan pekare eller ett annat namn i åtgärden.
  • Returdata skrivs till befintlig lagring om pekaren inte har värdet null.

I följande exempel visas hur du definierar en unik pekare.

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

I det här exemplet är parametern ach är en unik pekare för teckendata som skickas till en server som ska bearbetas med RemoteFn-rutinen.