Partager via


CFixedStringT : exemple de gestionnaire de chaînes personnalisé

La bibliothèque ATL implémente un exemple de gestionnaire de chaînes personnalisé utilisé par la classe CFixedStringT, appelée CFixedStringMgr. CFixedStringT est dérivé de CStringT et implémente une chaîne qui alloue ses données de caractères dans le cadre de l’objet CFixedStringT lui-même tant que la chaîne est inférieure à la longueur spécifiée par le t_nChars paramètre de modèle de CFixedStringT. Avec cette approche, la chaîne n’a pas besoin du tas du tout, sauf si la longueur de la chaîne augmente au-delà de la taille de la mémoire tampon fixe. Étant donné que CFixedStringT n’utilise pas toujours un tas pour allouer ses données de chaîne, il ne peut pas l’utiliser CAtlStringMgr comme gestionnaire de chaînes. Il utilise un gestionnaire de chaînes personnalisé (CFixedStringMgr), implémentant l’interface IAtlStringMgr . Cette interface est décrite dans Implémentation d’un gestionnaire de chaînes personnalisé (méthode avancée) .

Le constructeur prend CFixedStringMgr trois paramètres :

  • pData : pointeur vers la structure fixe CStringData à utiliser.

  • nChars : nombre maximal de caractères que la CStringData structure peut contenir.

  • pMgr : pointeur vers l’interface IAtlStringMgr d’un « gestionnaire de chaînes de sauvegarde ».

Le constructeur stocke les valeurs de pData et pMgr dans leurs variables membres respectives (m_pData et m_pMgr). Il définit ensuite la longueur de la mémoire tampon sur zéro, la longueur disponible égale à la taille maximale de la mémoire tampon fixe et le nombre de références sur -1. La valeur de nombre de références indique que la mémoire tampon est verrouillée et qu’elle utilise cette instance comme gestionnaire de CFixedStringMgr chaînes.

Le marquage de la mémoire tampon comme verrouillé empêche les autres CStringT instances de conserver une référence partagée à la mémoire tampon. Si d’autres CStringT instances ont été autorisées à partager la mémoire tampon, il serait possible que la mémoire tampon contenue CFixedStringT soit supprimée alors que d’autres chaînes utilisaient toujours la mémoire tampon.

CFixedStringMgr est une implémentation complète de l’interface IAtlStringMgr . L’implémentation de chaque méthode est abordée séparément.

Implémentation de CFixedStringMgr ::Allocate

Implémentation des CFixedStringMgr::Allocate premières case activée pour voir si la taille demandée de la chaîne est inférieure ou égale à la taille de la mémoire tampon fixe (stockée dans le m_pData membre). Si la mémoire tampon fixe est suffisamment grande, CFixedStringMgr verrouille la mémoire tampon fixe avec une longueur de zéro. Tant que la longueur de la chaîne ne dépasse pas la taille de la mémoire tampon fixe, CStringT il n’est pas nécessaire de réallouer la mémoire tampon.

Si la taille demandée de la chaîne est supérieure à la mémoire tampon CFixedStringMgr fixe transfère la requête au gestionnaire de chaînes de sauvegarde. Le gestionnaire de chaînes de sauvegarde est supposé allouer la mémoire tampon à partir du tas. Toutefois, avant de renvoyer cette mémoire tampon CFixedStringMgr , elle verrouille la mémoire tampon et remplace le pointeur du gestionnaire de chaînes de la mémoire tampon par un pointeur vers l’objet CFixedStringMgr . Cela garantit que les tentatives de réallouer ou de libérer la mémoire tampon en CStringT appelleront CFixedStringMgr.

Implémentation de CFixedStringMgr ::ReAllocate

L’implémentation est CFixedStringMgr::ReAllocate très similaire à son implémentation de Allocate.

Si la mémoire tampon réaffectée est la mémoire tampon fixe et que la taille de la mémoire tampon demandée est inférieure à la mémoire tampon fixe, aucune allocation n’est effectuée. Toutefois, si la mémoire tampon réaffectée n’est pas la mémoire tampon fixe, elle doit être une mémoire tampon allouée avec le gestionnaire de sauvegarde. Dans ce cas, le gestionnaire de sauvegarde est utilisé pour réallouer la mémoire tampon.

Si la mémoire tampon réaffectée est la mémoire tampon fixe et que la nouvelle taille de la mémoire tampon est trop grande pour s’adapter à la mémoire tampon fixe, CFixedStringMgr alloue une nouvelle mémoire tampon à l’aide du gestionnaire de sauvegarde. Le contenu de la mémoire tampon fixe est ensuite copié dans la nouvelle mémoire tampon.

Implémentation de CFixedStringMgr ::Free

L’implémentation de CFixedStringMgr::Free suit le même modèle que Allocate et ReAllocate. Si la mémoire tampon libérée est la mémoire tampon fixe, la méthode la définit sur une mémoire tampon verrouillée de longueur nulle. Si la mémoire tampon libérée a été allouée avec le gestionnaire de sauvegarde, CFixedStringMgr utilise le gestionnaire de sauvegarde pour la libérer.

Implémentation de CFixedStringMgr ::Clone

L’implémentation de CFixedStringMgr::Clone toujours retourne un pointeur vers le gestionnaire de sauvegarde plutôt que le CFixedStringMgr lui-même. Cela se produit parce que chaque instance de CFixedStringMgr ne peut être associée qu’à une seule instance de CStringT. Toutes les autres instances de tentative de CStringT cloner le gestionnaire doivent obtenir le gestionnaire de sauvegarde à la place. Cela est dû au fait que le gestionnaire de sauvegarde prend en charge le partage.

Implémentation de CFixedStringMgr ::GetNilString

Implémentation de CFixedStringMgr::GetNilString retourne la mémoire tampon fixe. En raison de la correspondance un-on-one de CFixedStringMgr et CStringT, une instance donnée de CStringT ne jamais utiliser plusieurs mémoires tampons à la fois. Par conséquent, une chaîne nil et une mémoire tampon de chaîne réelle ne sont jamais nécessaires en même temps.

Chaque fois que la mémoire tampon fixe n’est pas utilisée, CFixedStringMgr garantit qu’elle est initialisée avec une longueur nulle. Cela lui permet d’être utilisé comme chaîne nil. En guise de bonus supplémentaire, le nAllocLength membre de la mémoire tampon fixe est toujours défini sur la taille totale de la mémoire tampon fixe. Cela signifie que CStringT vous pouvez développer la chaîne sans appeler IAtlStringMgr ::Reallocate, même pour la chaîne nil.

Spécifications

En-tête : cstringt.h

Voir aussi

Gestion de la mémoire avec CStringT