Condividi tramite


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. Quando CStringT è necessario riallocare o liberare il buffer di stringa, chiama i metodi Reallocate o Free di questa interfaccia, passando la CStringData struttura come parametro. Quando si alloca una CStringData 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 una CStringData struttura, il gestore di stringhe deve impostare questo campo su zero. Quando si riallocazione di una CStringData 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 una CStringData 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 è possibile CStringT 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 di CStringT 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 di CStringT . In questo caso, il buffer viene considerato bloccato. Quando un'istanza CStringT usa un buffer bloccato, nessun'altra istanza di CStringT può condividere il buffer. Queste istanze creano invece una copia del buffer prima di modificare il contenuto. Inoltre, l'istanza CStringT che usa il buffer bloccato non tenta di condividere il buffer di qualsiasi altra CStringT istanza assegnata. In questo caso, l'istanza CStringT 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ò forza CStringT l'uso di questo buffer solo per l'istanza di CStringT che lo ha allocato.

Vedi anche

Gestione della memoria con CStringT