Freigeben über


CFixedStringT: Beispiel eines benutzerdefinierten Zeichenfolgenmanagers

Die ATL-Bibliothek implementiert ein Beispiel für einen benutzerdefinierten Zeichenfolgen-Manager, der von der Klasse CFixedStringT namens CFixedStringMgr verwendet wird. CFixedStringT wird von CStringT abgeleitet und implementiert eine Zeichenfolge, die ihre Zeichendaten als Teil des CFixedStringT Objekts selbst zuweist, solange die Zeichenfolge kleiner als die durch den t_nChars Vorlagenparameter CFixedStringTangegebene Länge ist. Bei diesem Ansatz benötigt die Zeichenfolge überhaupt nicht den Heap, es sei denn, die Länge der Zeichenfolge wächst über die Größe des festen Puffers hinaus. Da CFixedStringT ein Heap nicht immer zum Zuordnen seiner Zeichenfolgendaten verwendet wird, kann er nicht als Zeichenfolgen-Manager verwendet werden CAtlStringMgr . Es verwendet einen benutzerdefinierten Zeichenfolgen-Manager (CFixedStringMgr), der die IAtlStringMgr-Schnittstelle implementiert. Diese Schnittstelle wird in der Implementierung eines benutzerdefinierten Zeichenfolgen-Managers (Advanced Method) erläutert.

Der Konstruktor für CFixedStringMgr drei Parameter:

  • pData: Ein Zeiger auf die zu verwendende feste CStringData Struktur.

  • nChars: Die maximale Anzahl von Zeichen, die die CStringData Struktur enthalten kann.

  • pMgr: Ein Zeiger auf die IAtlStringMgr Schnittstelle eines "Sicherungszeichenfolgen-Managers".

Der Konstruktor speichert die Werte von pData und pMgr in den jeweiligen Membervariablen (m_pData und m_pMgr). Anschließend wird die Länge des Puffers auf Null festgelegt, die verfügbare Länge entspricht der maximalen Größe des festen Puffers und die Bezugsanzahl auf -1. Der Wert für die Referenzanzahl gibt an, dass der Puffer gesperrt ist und diese Instanz CFixedStringMgr als Zeichenfolgen-Manager verwendet werden soll.

Das Markieren des Puffers als gesperrt verhindert, dass andere CStringT Instanzen einen freigegebenen Verweis auf den Puffer speichern. Wenn andere CStringT Instanzen den Puffer freigeben dürfen, wäre es möglich, dass der puffer, der darin CFixedStringT enthalten ist, gelöscht werden kann, während andere Zeichenfolgen den Puffer noch verwenden.

CFixedStringMgr ist eine vollständige Implementierung der IAtlStringMgr Schnittstelle. Die Implementierung jeder Methode wird separat behandelt.

Implementierung von CFixedStringMgr::Assigned

Die Implementierung der CFixedStringMgr::Allocate ersten Überprüfungen, um festzustellen, ob die angeforderte Größe der Zeichenfolge kleiner oder gleich der Größe des festen Puffers ist (im m_pData Element gespeichert). Wenn der feste Puffer groß genug ist, CFixedStringMgr wird der feste Puffer mit einer Länge von Null gesperrt. Solange die Zeichenfolgenlänge nicht über die Größe des festen Puffers hinaus wächst, CStringT muss der Puffer nicht neu zugeordnet werden.

Wenn die angeforderte Größe der Zeichenfolge größer als der feste Puffer CFixedStringMgr ist, wird die Anforderung an den Sicherungszeichenfolgen-Manager weitergeleitet. Der Sicherungszeichenfolgen-Manager wird davon ausgegangen, dass der Puffer aus dem Heap zugewiesen wird. Bevor dieser Puffer jedoch zurückgegeben wird, wird der Puffer CFixedStringMgr gesperrt und der Zeichenfolgen-Manager-Zeiger des Puffers durch einen Zeiger auf das CFixedStringMgr Objekt ersetzt. Dadurch wird sichergestellt, dass Versuche, den Puffer neu zu gliedern oder freizuverlegen, aufgerufen CStringT werden CFixedStringMgr.

Implementierung von CFixedStringMgr::ReAllocate

Die Umsetzung ist sehr ähnlich wie bei der Umsetzung CFixedStringMgr::ReAllocate von Allocate.

Wenn der neu zugewiesene Puffer der feste Puffer ist und die angeforderte Puffergröße kleiner als der feste Puffer ist, erfolgt keine Zuordnung. Wenn der neu zugeordnete Puffer jedoch nicht der feste Puffer ist, muss er ein Puffer sein, der dem Sicherungs-Manager zugeordnet ist. In diesem Fall wird der Sicherungs-Manager verwendet, um den Puffer neu zu verlagern.

Wenn der neu zugeordnete Puffer der feste Puffer ist und die neue Puffergröße zu groß ist, um in den festen Puffer zu passen, CFixedStringMgr wird mithilfe des Sicherungs-Managers ein neuer Puffer zugewiesen. Der Inhalt des festen Puffers wird dann in den neuen Puffer kopiert.

Implementierung von CFixedStringMgr::Free

Die Implementierung folgt CFixedStringMgr::Free demselben Muster wie Allocate und ReAllocate. Wenn der freigestellte Puffer der feste Puffer ist, legt die Methode ihn auf einen gesperrten Puffer der Länge Null fest. Wenn der Freihandpuffer dem Sicherungs-Manager zugewiesen wurde, CFixedStringMgr wird der Sicherungs-Manager zum Freigeben verwendet.

Implementierung von CFixedStringMgr::Clone

Die Implementierung von CFixedStringMgr::Clone always returns a pointer to the backup manager rather than the CFixedStringMgr itself. Dies geschieht, da jede Instanz nur einer einzelnen Instanz von CFixedStringMgr CStringTzugeordnet werden kann. Alle anderen Instanzen, CStringT die versuchen, den Manager zu klonen, sollten stattdessen den Sicherungs-Manager abrufen. Dies liegt daran, dass der Sicherungs-Manager die Gemeinsame Nutzung unterstützt.

Implementierung von CFixedStringMgr::GetNilString

Die Implementierung der Rückgabe des CFixedStringMgr::GetNilString festen Puffers. Aufgrund der 1:1-Korrespondenz von CFixedStringMgr und CStringT, eine bestimmte Instanz von CStringT niemals mehr als einen Puffer gleichzeitig verwendet. Daher werden nie gleichzeitig eine Nilzeichenfolge und ein echter Zeichenfolgenpuffer benötigt.

Wenn der feste Puffer nicht verwendet wird, wird sichergestellt, CFixedStringMgr dass er mit einer Länge null initialisiert wird. Dadurch kann sie als Nilzeichenfolge verwendet werden. Als zusätzlicher Bonus wird das nAllocLength Mitglied des festen Puffers immer auf die volle Größe des festen Puffers festgelegt. Dies bedeutet, dass CStringT die Zeichenfolge vergrößert werden kann, ohne IAtlStringMgr::Reallocate, auch für die Nilzeichenfolge.

Anforderungen

Kopfzeile: cstringt.h

Siehe auch

Speicherverwaltung mit CStringT