Freigeben über


Implementierung eines benutzerdefinierten Zeichenfolgenmanagers (fortgeschrittene Methode)

In speziellen Situationen möchten Sie möglicherweise einen benutzerdefinierten Zeichenfolgen-Manager implementieren, der mehr als nur die Änderung des Heaps zum Zuweisen von Arbeitsspeicher ausführt. In diesem Fall müssen Sie die IAtlStringMgr-Schnittstelle manuell als benutzerdefinierten Zeichenfolgen-Manager implementieren.

Um dies zu tun, ist es wichtig, zunächst zu verstehen, wie CStringT diese Schnittstelle verwendet, um seine Zeichenfolgendaten zu verwalten. Jede Instanz von CStringT weist einen Zeiger auf eine CStringData-Struktur auf. Diese Struktur mit variabler Länge enthält wichtige Informationen zur Zeichenfolge (z. B. Länge) sowie die tatsächlichen Zeichendaten für die Zeichenfolge. Jeder benutzerdefinierte Zeichenfolgen-Manager ist für das Zuweisen und Freigeben dieser Strukturen auf Anforderung verantwortlich CStringT.

Die CStringData Struktur umfasst vier Bereiche:

  • pStringMgr Dieses Feld verweist auf die Schnittstelle, die IAtlStringMgr zum Verwalten dieser Zeichenfolgendaten verwendet wird. Wenn CStringT der Zeichenfolgenpuffer neu zugeordnet oder freigegeben werden muss, ruft er die Methoden "Reallocate" oder "Free" dieser Schnittstelle auf, und übergibt die CStringData Struktur als Parameter. Beim Zuweisen einer CStringData Struktur im Zeichenfolgen-Manager müssen Sie dieses Feld so festlegen, dass es auf den benutzerdefinierten Zeichenfolgen-Manager verweist.

  • nDataLength Dieses Feld enthält die aktuelle logische Länge der im Puffer gespeicherten Zeichenfolge mit Ausnahme des endenden Null-Werts. CStringT aktualisiert dieses Feld, wenn sich die Länge der Zeichenfolge ändert. Beim Zuordnen einer CStringData Struktur muss der Zeichenfolgen-Manager dieses Feld auf Null festlegen. Wenn Sie eine CStringData Struktur neu zuweisen, muss der benutzerdefinierte Zeichenfolgen-Manager dieses Feld unverändert lassen.

  • nAllocLength Dieses Feld enthält die maximale Anzahl von Zeichen (mit Ausnahme der endierenden NULL), die in diesem Zeichenfolgenpuffer gespeichert werden kann, ohne sie neu zuzuweisen. Jedes Mal CStringT , wenn die logische Länge der Zeichenfolge erhöht werden muss, überprüft es zunächst dieses Feld, um sicherzustellen, dass genügend Speicherplatz im Puffer vorhanden ist. Wenn die Überprüfung fehlschlägt, rufen Sie den benutzerdefinierten Zeichenfolgen-Manager auf, CStringT um den Puffer neu zu gliedern. Wenn Sie eine CStringData Struktur zuordnen oder neu zuordnen, müssen Sie dieses Feld mindestens auf die Anzahl der zeichen festlegen, die im Parameter "nChars " an "IAtlStringMgr::Allocate " oder "IAtlStringMgr::Reallocate" angefordert wurden. Wenn im Puffer mehr Speicherplatz vorhanden ist als angefordert, können Sie diesen Wert so festlegen, dass er die tatsächliche Verfügbare Speicherplatzmenge widerspiegelt. Dadurch kann CStringT die Zeichenfolge vergrößert werden, um den gesamten zugewiesenen Speicherplatz auszufüllen, bevor der Zeichenfolgen-Manager wieder in den Zeichenfolgen-Manager zurückgerufen werden muss, um den Puffer neu zuzuordnen.

  • nRefs Dieses Feld enthält die aktuelle Bezugsanzahl des Zeichenfolgenpuffers. Wenn der Wert eins ist, verwendet eine einzelne Instanz CStringT den Puffer. Darüber hinaus kann die Instanz sowohl den Inhalt des Puffers lesen als auch ändern. Wenn der Wert größer als eins ist, können mehrere Instanzen des Puffers CStringT verwenden. Da der Zeichenpuffer freigegeben ist, CStringT können Instanzen nur den Inhalt des Puffers lesen. Um den Inhalt zu ändern, CStringT wird zunächst eine Kopie des Puffers erstellt. Wenn der Wert negativ ist, wird nur eine Instanz des Puffers CStringT verwendet. In diesem Fall gilt der Puffer als gesperrt. Wenn eine CStringT Instanz einen gesperrten Puffer verwendet, können keine anderen Instanzen des CStringT Puffers gemeinsam verwendet werden. Stattdessen erstellen diese Instanzen eine Kopie des Puffers, bevor sie den Inhalt bearbeiten. Darüber hinaus versucht die Instanz, die CStringT den gesperrten Puffer verwendet, nicht, den Puffer einer anderen CStringT Instanz freizugeben, die ihm zugewiesen wurde. In diesem Fall kopiert die CStringT Instanz die andere Zeichenfolge in den gesperrten Puffer.

    Wenn Sie eine CStringData Struktur zuordnen, müssen Sie dieses Feld so festlegen, dass er den Typ der Freigabe widerspiegelt, die für den Puffer zulässig ist. Legen Sie diesen Wert für die meisten Implementierungen auf einen fest. Dies ermöglicht das übliche Kopier-on-Write-Freigabeverhalten. Wenn ihr Zeichenfolgen-Manager jedoch die Freigabe des Zeichenfolgenpuffers nicht unterstützt, legen Sie dieses Feld auf einen gesperrten Zustand fest. Dies erzwingt CStringT nur die Verwendung dieses Puffers für die Instanz, die CStringT sie zugewiesen hat.

Siehe auch

Speicherverwaltung mit CStringT