Implementazione di una gestione stringhe personalizzata (metodo avanzato)
In situazioni specializzate, è possibile implementare un gestore di stringhe personalizzato che esegue più di una semplice modifica dell'heap usato per allocare memoria. In questo caso, è necessario implementare manualmente l'interfaccia IAtlStringMgr come gestore di stringhe personalizzato.
A tale scopo, è importante comprendere prima come CStringT usa tale interfaccia per gestire i dati stringa. Ogni istanza di CStringT
ha un puntatore a una struttura CStringData . Questa struttura a lunghezza variabile contiene informazioni importanti sulla stringa ,ad esempio la lunghezza, nonché i dati di carattere effettivi per la stringa. Ogni gestore di stringhe personalizzato è responsabile dell'allocazione e della liberazione di queste strutture alla richiesta di CStringT
.
La CStringData
struttura comprende quattro campi:
pStringMgr Questo campo punta all'interfaccia
IAtlStringMgr
usata per gestire questi dati stringa. QuandoCStringT
è necessario riallocare o liberare il buffer di stringa, chiama i metodi Reallocate o Free di questa interfaccia, passando laCStringData
struttura come parametro. Quando si alloca unaCStringData
struttura nella gestione stringhe, è necessario impostare questo campo in modo che punti al gestore di stringhe personalizzato.nDataLength Questo campo contiene la lunghezza logica corrente della stringa archiviata nel buffer escluso il valore Null di terminazione.
CStringT
aggiorna questo campo quando cambia la lunghezza della stringa. Quando si alloca unaCStringData
struttura, il gestore di stringhe deve impostare questo campo su zero. Quando si riallocazione di unaCStringData
struttura, il gestore di stringhe personalizzato deve lasciare invariato questo campo.nAllocLength Questo campo contiene il numero massimo di caratteri (escluso il valore Null di terminazione) che può essere archiviato in questo buffer di stringhe senza riallocazione. Ogni volta che
CStringT
deve aumentare la lunghezza logica della stringa, controlla prima di tutto questo campo per assicurarsi che nel buffer sia presente spazio sufficiente. Se il controllo ha esito negativo,CStringT
chiama nella gestione delle stringhe personalizzate per riallocare il buffer. Quando si alloca o si rialloca unaCStringData
struttura, è necessario impostare questo campo su almeno il numero di caratteri richiesti nel parametro nChars su IAtlStringMgr::Allocate o IAtlStringMgr::Reallocate. Se nel buffer è presente più spazio di quanto richiesto, è possibile impostare questo valore in modo da riflettere la quantità effettiva di spazio disponibile. In questo modo è possibileCStringT
aumentare la stringa per riempire l'intero spazio allocato prima di dover richiamare il gestore di stringhe per riallocare il buffer.nRefs Questo campo contiene il conteggio dei riferimenti corrente del buffer di stringhe. Se il valore è uno, una singola istanza di
CStringT
usa il buffer. Inoltre, l'istanza può leggere e modificare il contenuto del buffer. Se il valore è maggiore di uno, più istanze diCStringT
possono usare il buffer. Poiché il buffer dei caratteri è condiviso,CStringT
le istanze possono leggere solo il contenuto del buffer. Per modificare il contenuto,CStringT
crea prima di tutto una copia del buffer. Se il valore è negativo, viene usata solo un'istanza diCStringT
. In questo caso, il buffer viene considerato bloccato. Quando un'istanzaCStringT
usa un buffer bloccato, nessun'altra istanza diCStringT
può condividere il buffer. Queste istanze creano invece una copia del buffer prima di modificare il contenuto. Inoltre, l'istanzaCStringT
che usa il buffer bloccato non tenta di condividere il buffer di qualsiasi altraCStringT
istanza assegnata. In questo caso, l'istanzaCStringT
copia l'altra stringa nel buffer bloccato.Quando si alloca una
CStringData
struttura, è necessario impostare questo campo in modo che rifletta il tipo di condivisione consentito per il buffer. Per la maggior parte delle implementazioni, impostare questo valore su uno. Ciò consente il normale comportamento di condivisione di copia su scrittura. Tuttavia, se gestione stringhe non supporta la condivisione del buffer di stringhe, impostare questo campo su uno stato bloccato. Ciò forzaCStringT
l'uso di questo buffer solo per l'istanza diCStringT
che lo ha allocato.