CFixedStringT: ejemplo de un administrador de cadenas personalizado
La biblioteca ATL implementa un ejemplo de un administrador de cadenas personalizado usado por la clase CFixedStringT, denominado CFixedStringMgr. CFixedStringT
se deriva de CStringT e implementa una cadena que asigna sus datos de caracteres como parte del propio objeto CFixedStringT
siempre que la cadena sea menor que la longitud especificada por el parámetro de plantilla t_nChars
de CFixedStringT
. Con este enfoque, la cadena no necesita el montón en absoluto, a menos que la longitud de la cadena crezca más allá del tamaño del búfer fijo. Dado que CFixedStringT
no siempre usa un montón para asignar sus datos de cadena, no puede usar CAtlStringMgr
como administrador de cadenas. Usa un administrador de cadenas personalizado (CFixedStringMgr
), que implementa la interfaz IAtlStringMgr. Esta interfaz se describe en Implementación de un Administrador de cadenas personalizado (método avanzado).
El constructor de CFixedStringMgr
toma tres parámetros:
pData: puntero a la estructura fija
CStringData
que se va a usar.nChars: número máximo de caracteres que puede contener la estructura
CStringData
.Pmgr: puntero a la interfaz
IAtlStringMgr
de un "administrador de cadenas de copia de seguridad".
El constructor almacena los valores de pData y pMgr en sus respectivas variables miembro (m_pData
y m_pMgr
). A continuación, establece la longitud del búfer en cero, la longitud disponible igual al tamaño máximo del búfer fijo y el recuento de referencias en -1. El valor de recuento de referencias indica que el búfer está bloqueado y para usar esta instancia de CFixedStringMgr
como administrador de cadenas.
Marcar el búfer como bloqueado impide que otras instancias CStringT
contengan una referencia compartida al búfer. Si se permitía que otras instancias CStringT
compartan el búfer, sería posible que se eliminara el búfer contenido CFixedStringT
, mientras que otras cadenas todavía estaban usando el búfer.
CFixedStringMgr
es una implementación completa de la interfaz IAtlStringMgr
. La implementación de cada método se describe por separado.
Implementación de CFixedStringMgr::Allocate
La implementación de CFixedStringMgr::Allocate
primero comprueba si el tamaño solicitado de la cadena es menor o igual que el tamaño del búfer fijo (almacenado en el miembro m_pData
). Si el búfer fijo es lo suficientemente grande, CFixedStringMgr
bloquea el búfer fijo con una longitud de cero. Siempre que la longitud de la cadena no crezca más allá del tamaño del búfer fijo, CStringT
no tendrá que reasignar el búfer.
Si el tamaño solicitado de la cadena es mayor que el búfer CFixedStringMgr
fijo reenvía la solicitud al administrador de cadenas de copia de seguridad. Se supone que el administrador de cadenas de copia de seguridad asigna el búfer del montón. Sin embargo, antes de devolver este búfer, CFixedStringMgr
bloquea el búfer y reemplaza el puntero del administrador de cadenas del búfer por un puntero al objeto CFixedStringMgr
. Esto garantiza que los intentos de reasignar o liberar el búfer mediante CStringT
llamarán a CFixedStringMgr
.
Implementación de CFixedStringMgr::ReAllocate
La implementación de CFixedStringMgr::ReAllocate
es muy similar a su implementación de Allocate
.
Si el búfer que se reasigna es el búfer fijo y el tamaño del búfer solicitado es menor que el búfer fijo, no se realiza ninguna asignación. Sin embargo, si el búfer que se reasigna no es el búfer fijo, debe ser un búfer asignado con el administrador de copias de seguridad. En este caso, el administrador de copias de seguridad se usa para reasignar el búfer.
Si el búfer que se reasigna es el búfer fijo y el nuevo tamaño del búfer es demasiado grande para ajustarse al búfer fijo, CFixedStringMgr
asigna un nuevo búfer mediante el administrador de copias de seguridad. A continuación, el contenido del búfer fijo se copia en el nuevo búfer.
Implementación de CFixedStringMgr::Free
La implementación de CFixedStringMgr::Free
sigue el mismo patrón que Allocate
y ReAllocate
. Si el búfer que se libera es el búfer fijo, el método lo establece en un búfer bloqueado de longitud cero. Si el búfer que se libera se asignó con el administrador de copias de seguridad, CFixedStringMgr
usa el administrador de copias de seguridad para liberarlo.
Implementación de CFixedStringMgr::Clone
La implementación de CFixedStringMgr::Clone
siempre devuelve un puntero al administrador de copias de seguridad en lugar del mismo CFixedStringMgr
. Esto sucede porque cada instancia de CFixedStringMgr
solo se puede asociar a una única instancia de CStringT
. Cualquier otra instancia de CStringT
que intenta clonar el administrador debe obtener el administrador de copia de seguridad en su lugar. Esto se debe a que el administrador de copias de seguridad admite el uso compartido.
Implementación de CFixedStringMgr::GetNilString
La implementación de CFixedStringMgr::GetNilString
devuelve el búfer fijo. Debido a la correspondencia uno a uno de CFixedStringMgr
y CStringT
, una instancia determinada de nunca usa más de un búfer CStringT
a la vez. Por lo tanto, nunca se necesita una cadena nula y un búfer de cadena real al mismo tiempo.
Siempre que el búfer fijo no esté en uso, CFixedStringMgr
garantiza que se inicializa con una longitud cero. Esto permite su uso como cadena nula. Como bonificación adicional, el miembro nAllocLength
del búfer fijo siempre se establece en el tamaño completo del búfer fijo. Esto significa que CStringT
puede aumentar la cadena sin llamar a IAtlStringMgr::Reallocate, incluso para la cadena nula.
Requisitos
Encabezado: cstringt.h
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de