Implementatie van een aangepast tekenreeksbeheer (geavanceerde methode)

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) en de Active Template Library (ATL) worden nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

In gespecialiseerde situaties wilt u mogelijk een aangepast tekenreeksbeheer implementeren dat meer doet dan alleen wijzigen welke heap wordt gebruikt om geheugen toe te wijzen. In deze situatie moet u de IAtlStringMgr-interface handmatig implementeren als uw aangepaste tekenreeksbeheer.

Om dit te doen, is het belangrijk om eerst te begrijpen hoe CStringT die interface gebruikt om de tekenreeksgegevens te beheren. Elk exemplaar heeft CStringT een aanwijzer naar een CStringData-structuur . Deze structuur met variabele lengte bevat belangrijke informatie over de tekenreeks (zoals lengte), evenals de werkelijke tekengegevens voor de tekenreeks. Elke aangepaste tekenreeksbeheerder is verantwoordelijk voor het toewijzen en vrijmaken van deze structuren op verzoek van CStringT.

De CStringData structuur bestaat uit vier velden:

  • pStringMgr Dit veld verwijst naar de IAtlStringMgr interface die wordt gebruikt om deze tekenreeksgegevens te beheren. Wanneer CStringT u de tekenreeksbuffer opnieuw wilt toewijzen of vrij wilt maken, wordt de methode Opnieuw toewijzen of Vrij van deze interface aangeroepen, waarbij de CStringData structuur als parameter wordt doorgegeven. Wanneer u een CStringData structuur toewijst in uw tekenreeksbeheer, moet u dit veld zo instellen dat deze verwijst naar uw aangepaste tekenreeksbeheer.

  • nDataLength Dit veld bevat de huidige logische lengte van de tekenreeks die is opgeslagen in de buffer, met uitzondering van de afsluit null. CStringT werkt dit veld bij wanneer de lengte van de tekenreeks verandert. Bij het toewijzen van een CStringData structuur moet uw tekenreeksbeheerder dit veld instellen op nul. Bij het opnieuw toewijzen van een CStringData structuur moet uw aangepaste tekenreeksbeheer dit veld ongewijzigd laten.

  • nAllocLength Dit veld bevat het maximum aantal tekens (met uitzondering van het afsluitnd null) dat in deze tekenreeksbuffer kan worden opgeslagen zonder deze opnieuw te verplaatsen. Wanneer CStringT de logische lengte van de tekenreeks moet worden verhoogd, controleert het eerst dit veld om ervoor te zorgen dat er voldoende ruimte in de buffer is. Als de controle mislukt, CStringT roept u uw aangepaste tekenreeksbeheer aan om de buffer opnieuw te toewijzen. Wanneer u een CStringData structuur toewijst of opnieuw toewijst, moet u dit veld instellen op ten minste het aantal tekens dat is aangevraagd in de parameter nChars op IAtlStringMgr::Toewijzen of IAtlStringMgr::Reallocate. Als er meer ruimte in de buffer is dan is aangevraagd, kunt u deze waarde instellen om de werkelijke hoeveelheid beschikbare ruimte weer te geven. Hierdoor kan CStringT de tekenreeks de volledige toegewezen ruimte vullen voordat deze weer moet worden aangeroepen in de tekenreeksbeheerder om de buffer opnieuw te kunnen toewijzen.

  • nRefs Dit veld bevat het huidige verwijzingsaantal van de tekenreeksbuffer. Als de waarde één is, wordt de buffer door één exemplaar CStringT gebruikt. Daarnaast mag het exemplaar zowel de inhoud van de buffer lezen als wijzigen. Als de waarde groter is dan één, kunnen meerdere exemplaren CStringT de buffer gebruiken. Omdat de tekenbuffer wordt gedeeld, CStringT kunnen exemplaren alleen de inhoud van de buffer lezen. Als u de inhoud wilt wijzigen, CStringT maakt u eerst een kopie van de buffer. Als de waarde negatief is, wordt slechts één exemplaar van CStringT de buffer gebruikt. In dit geval wordt de buffer beschouwd als vergrendeld. Wanneer een CStringT exemplaar een vergrendelde buffer gebruikt, kunnen er geen andere exemplaren van CStringT de buffer delen. In plaats daarvan maken deze exemplaren een kopie van de buffer voordat ze de inhoud bewerken. Daarnaast probeert het CStringT exemplaar dat gebruikmaakt van de vergrendelde buffer niet de buffer te delen van een ander CStringT exemplaar dat eraan is toegewezen. In dit geval kopieert het CStringT exemplaar de andere tekenreeks naar de vergrendelde buffer.

    Bij het toewijzen van een CStringData structuur moet u dit veld instellen op basis van het type delen dat is toegestaan voor de buffer. Voor de meeste implementaties stelt u deze waarde in op één. Hierdoor kan het normale gedrag voor het delen van kopiëren op schrijfbewerkingen worden toegestaan. Als uw tekenreeksbeheer het delen van de tekenreeksbuffer echter niet ondersteunt, stelt u dit veld in op een vergrendelde status. Dit dwingt CStringT ertoe om deze buffer alleen te gebruiken voor het exemplaar van CStringT de toegewezen buffer.

Zie ook

Geheugenbeheer met CStringT