Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
IAtlStringMgrutilisée pour gérer ces données de chaîne. LorsqueCStringTvous 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 laCStringDatastructure en tant que paramètre. Lors de l’allocation d’uneCStringDatastructure 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.
CStringTmet à jour ce champ lorsque la longueur de la chaîne change. Lors de l’allocation d’uneCStringDatastructure, votre gestionnaire de chaînes doit définir ce champ sur zéro. Lors de la réaffectation d’uneCStringDatastructure, 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
CStringTdevez 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,CStringTappelle votre gestionnaire de chaînes personnalisé pour réallouer la mémoire tampon. Lors de l’allocation ou de la réaffectation d’uneCStringDatastructure, 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 permetCStringTde 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
CStringTutilise 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 peuventCStringTutiliser la mémoire tampon. Étant donné que la mémoire tampon de caractères est partagée,CStringTles instances peuvent uniquement lire le contenu de la mémoire tampon. Pour modifier le contenu,CStringTeffectue d’abord une copie de la mémoire tampon. Si la valeur est négative, une seule instanceCStringTutilise la mémoire tampon. Dans ce cas, la mémoire tampon est considérée comme verrouillée. Lorsqu’uneCStringTinstance utilise une mémoire tampon verrouillée, aucune autre instance neCStringTpeut 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’instanceCStringTqui utilise la mémoire tampon verrouillée ne tente pas de partager la mémoire tampon d’une autreCStringTinstance qui lui est affectée. Dans ce cas, l’instanceCStringTcopie l’autre chaîne dans la mémoire tampon verrouillée.Lors de l’allocation d’une
CStringDatastructure, 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-ciCStringTallouée.