Implémentation d’un gestionnaire de chaînes personnalisé (méthode avancée)
Dans des situations spécialisées, vous pouvez implémenter un gestionnaire de chaînes personnalisé qui ne modifie pas simplement le tas utilisé pour allouer de la mémoire. Dans ce cas, vous devez implémenter manuellement l’interface IAtlStringMgr en tant que gestionnaire de chaînes personnalisé.
Pour ce faire, il est important de comprendre d’abord comment CStringT utilise cette interface pour gérer ses données de chaîne. Chaque instance d’un CStringT
pointeur vers une structure CStringData . Cette structure de longueur variable contient des informations importantes sur la chaîne (telle que la longueur), ainsi que les données de caractères réelles pour la chaîne. Chaque gestionnaire de chaînes personnalisé est responsable de l’allocation et de la libération de ces structures à la demande de CStringT
.
La CStringData
structure comprend quatre champs :
pStringMgr Ce champ pointe vers l’interface
IAtlStringMgr
utilisée pour gérer ces données de chaîne. LorsqueCStringT
vous devez réallouer ou libérer la mémoire tampon de chaîne, elle appelle les méthodes Reallocate ou Free de cette interface, en passant laCStringData
structure en tant que paramètre. Lors de l’allocation d’uneCStringData
structure dans votre gestionnaire de chaînes, vous devez définir ce champ pour qu’il pointe vers votre gestionnaire de chaînes personnalisé.nDataLength Ce champ contient la longueur logique actuelle de la chaîne stockée dans la mémoire tampon, à l’exclusion de la valeur Null de fin.
CStringT
met à jour ce champ lorsque la longueur de la chaîne change. Lors de l’allocation d’uneCStringData
structure, votre gestionnaire de chaînes doit définir ce champ sur zéro. Lors de la réaffectation d’uneCStringData
structure, votre gestionnaire de chaînes personnalisé doit laisser ce champ inchangé.nAllocLength Ce champ contient le nombre maximal de caractères (à l’exception de la valeur null de fin) qui peuvent être stockés dans cette mémoire tampon de chaîne sans la réallouer. Chaque fois que vous
CStringT
devez augmenter la longueur logique de la chaîne, il vérifie d’abord que ce champ contient suffisamment d’espace dans la mémoire tampon. Si la vérification échoue,CStringT
appelle votre gestionnaire de chaînes personnalisé pour réallouer la mémoire tampon. Lors de l’allocation ou de la réaffectation d’uneCStringData
structure, vous devez définir ce champ sur au moins le nombre de caractères demandés dans le paramètre nChars sur IAtlStringMgr ::Allocate ou IAtlStringMgr ::Reallocate. S’il y a plus d’espace dans la mémoire tampon que demandé, vous pouvez définir cette valeur pour refléter la quantité réelle d’espace disponible. Cela permetCStringT
de développer la chaîne pour remplir l’espace alloué entier avant de devoir rappeler dans le gestionnaire de chaînes pour réallouer la mémoire tampon.nRefs Ce champ contient le nombre de références actuel de la mémoire tampon de chaîne. Si la valeur est une, une seule instance
CStringT
utilise la mémoire tampon. En outre, l’instance est autorisée à lire et modifier le contenu de la mémoire tampon. Si la valeur est supérieure à une, plusieurs instances peuventCStringT
utiliser la mémoire tampon. Étant donné que la mémoire tampon de caractères est partagée,CStringT
les instances peuvent uniquement lire le contenu de la mémoire tampon. Pour modifier le contenu,CStringT
effectue d’abord une copie de la mémoire tampon. Si la valeur est négative, une seule instanceCStringT
utilise la mémoire tampon. Dans ce cas, la mémoire tampon est considérée comme verrouillée. Lorsqu’uneCStringT
instance utilise une mémoire tampon verrouillée, aucune autre instance neCStringT
peut partager la mémoire tampon. Au lieu de cela, ces instances créent une copie de la mémoire tampon avant de manipuler le contenu. En outre, l’instanceCStringT
qui utilise la mémoire tampon verrouillée ne tente pas de partager la mémoire tampon d’une autreCStringT
instance qui lui est affectée. Dans ce cas, l’instanceCStringT
copie l’autre chaîne dans la mémoire tampon verrouillée.Lors de l’allocation d’une
CStringData
structure, vous devez définir ce champ pour refléter le type de partage autorisé pour la mémoire tampon. Pour la plupart des implémentations, définissez cette valeur sur une. Cela permet le comportement de partage de copie en écriture habituel. Toutefois, si votre gestionnaire de chaînes ne prend pas en charge le partage de la mémoire tampon de chaîne, définissez ce champ sur un état verrouillé. Cela forceCStringT
à utiliser uniquement cette mémoire tampon pour l’instance de celle-ciCStringT
allouée.