Compartir a través de


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

Administración de memoria con CStringT