Partager via


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. Lorsque CStringT 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 la CStringData structure en tant que paramètre. Lors de l’allocation d’une CStringData 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’une CStringData structure, votre gestionnaire de chaînes doit définir ce champ sur zéro. Lors de la réaffectation d’une CStringData 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 qu’il CStringT faut augmenter la longueur logique de la chaîne, il case activée d’abord ce champ pour vous assurer qu’il y a suffisamment d’espace dans la mémoire tampon. Si le case activée é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’une CStringData 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 permet CStringT 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 peuvent CStringT 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 instance CStringT utilise la mémoire tampon. Dans ce cas, la mémoire tampon est considérée comme verrouillée. Lorsqu’une CStringT instance utilise une mémoire tampon verrouillée, aucune autre instance ne CStringT 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’instance CStringT qui utilise la mémoire tampon verrouillée ne tente pas de partager la mémoire tampon d’une autre CStringT instance qui lui est affectée. Dans ce cas, l’instance CStringT 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 force CStringT à utiliser uniquement cette mémoire tampon pour l’instance de celle-ci CStringT allouée.

Voir aussi

Gestion de la mémoire avec CStringT