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 CFixedStringT
angegebene 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
CStringT
zugeordnet 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