Delen via


Unieke aanwijzers

In C-programma's kan meer dan één aanwijzer het adres van gegevens bevatten. De aanwijzers worden gezegd om een alias te maken voor de gegevens. Aliassen worden ook gemaakt wanneer aanwijzers verwijzen naar gedeclareerde variabelen. Het volgende codefragment illustreert beide methoden voor aliasing:

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 een typisch C-programma kunt u een binaire structuur opgeven met behulp van de volgende definitie:

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

TREETYPE * troot;

Meer dan één aanwijzer heeft toegang tot de inhoud van een structuurknooppunt. Dit is over het algemeen prima voor niet-gedistribueerde toepassingen. Deze programmeerstijl genereert echter complexere RPC-ondersteuningscode. De client- en server-stubs vereisen de aanvullende code voor het beheren van de gegevens en de aanwijzers. De onderliggende stub-code moet de verschillende aanwijzers naar de adressen omzetten en bepalen welke kopie van de gegevens de meest recente versie vertegenwoordigt.

De hoeveelheid verwerking kan worden verminderd als u garandeert dat uw aanwijzer de enige manier is waarop de toepassing toegang heeft tot dat geheugengebied. De aanwijzer kan nog steeds veel van de functies van een C-aanwijzer hebben. Het kan bijvoorbeeld veranderen tussen null- en niet-null- waarden of hetzelfde blijven. In het volgende voorbeeld ziet u dit. De aanwijzer wordt null- vóór de aanroep en verwijst naar een geldige tekenreeks na de aanroep:

aanwijzer wisselen tussen null- en niet-null-waarden

Standaard past de MIDL-compiler het kenmerk [unieke] aanwijzer toe op alle aanwijzers die geen parameters zijn. Deze standaardinstelling kan worden gewijzigd met het kenmerk [pointer_default].

Een unieke aanwijzer heeft de volgende kenmerken:

  • Deze kan de waarde null-hebben.
  • Deze kan tijdens de aanroep veranderen van null- in niet-null-. Wanneer de waarde wordt gewijzigd in niet-null-, wordt er een nieuw geheugen toegewezen wanneer deze wordt geretourneerd.
  • Deze kan tijdens het aanroepen veranderen van niet-null- in null-. Wanneer de waarde verandert in NULL-, is de toepassing verantwoordelijk voor het vrijmaken van het geheugen.
  • De waarde kan worden gewijzigd van een niet-null- waarde in een andere waarde.
  • De opslag waarnaar een unieke aanwijzer verwijst, kan niet worden geopend door een andere aanwijzer of naam in de bewerking.
  • Retourgegevens worden naar de bestaande opslag geschreven als de aanwijzer niet over de waarde null-beschikt.

In het volgende voorbeeld ziet u hoe u een unieke aanwijzer definieert.

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

In dit voorbeeld is de parameter ach een unieke aanwijzer naar tekengegevens die naar een server worden verzonden om te worden verwerkt met de RemoteFn-routine.