Partilhar via


CFixedStringT: Exemplo de um Gestor de Strings Personalizado

Observação

A biblioteca Microsoft Foundation Classes (MFC) e a Active Template Library (ATL) continuam a ser suportadas. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

A biblioteca ATL implementa um exemplo de gestor de strings personalizado usado pela classe CFixedStringT, chamado CFixedStringMgr. CFixedStringT é derivado de CStringT e implementa uma cadeia que aloca os seus dados de carácter como parte do CFixedStringT próprio objeto, desde que a cadeia seja inferior ao comprimento especificado pelo t_nChars parâmetro template de CFixedStringT. Com esta abordagem, a cadeia não precisa do heap, a menos que o comprimento da corda ultrapasse o tamanho do buffer fixo. Como CFixedStringT nem sempre usa um heap para alocar os seus dados de strings, não pode ser usado CAtlStringMgr como gestor de strings. Utiliza um gestor de strings personalizado (CFixedStringMgr), implementando a interface IAtlStringMgr . Esta interface é discutida em Implementação de um Gestor de Strings Personalizado (Método Avançado).

O construtor para CFixedStringMgr assume três parâmetros:

  • pData: Um ponteiro para a estrutura fixa CStringData a ser usada.

  • nChars: O número máximo de caracteres que a CStringData estrutura pode conter.

  • pMgr: Um apontador para a IAtlStringMgr interface de um "gestor de string de backup."

O construtor armazena os valores de pData e pMgr nas respetivas variáveis membros (m_pData e m_pMgr). Depois, define o comprimento do buffer para zero, o comprimento disponível igual ao tamanho máximo do buffer fixo, e a contagem de referência para -1. O valor da contagem de referência indica que o buffer está bloqueado e para usar esta instância de CFixedStringMgr como gestor de strings.

Marcar o buffer como bloqueado impede que outras CStringT instâncias mantenham uma referência partilhada ao buffer. Se outras CStringT instâncias fossem autorizadas a partilhar o buffer, seria possível que o buffer contido por CFixedStringT fosse eliminado enquanto outras strings continuassem a usar o buffer.

CFixedStringMgr é uma implementação completa da IAtlStringMgr interface. A implementação de cada método é discutida separadamente.

Implementação de CFixedStringMgr::Allocate

A implementação de CFixedStringMgr::Allocate verificações iniciais para verificar se o tamanho solicitado da string é menor ou igual ao tamanho do buffer fixo (armazenado no m_pData membro). Se o buffer fixo for suficientemente grande, CFixedStringMgr bloqueia o buffer fixo com um comprimento zero. Desde que o comprimento da corda não cresça para além do tamanho do buffer fixo, CStringT não será necessário realocar o buffer.

Se o tamanho solicitado da string for superior ao buffer CFixedStringMgr fixo, o pedido é encaminhado para o gestor de string de backup. Presume-se que o gestor de string de backup aloque o buffer do heap. No entanto, antes de regressar, este buffer CFixedStringMgr bloqueia o buffer e substitui o ponteiro do gestor de strings do buffer por um ponteiro para o CFixedStringMgr objeto. Isto garante que as tentativas de realocar ou libertar o buffer por CStringT vão chamar para CFixedStringMgr.

Implementação do CFixedStringMgr::ReAllocate

A implementação de CFixedStringMgr::ReAllocate é muito semelhante à sua implementação de Allocate.

Se o buffer a realocar for o buffer fixo e o tamanho do buffer solicitado for menor do que o buffer fixo, não é feita alocação. No entanto, se o buffer a realocar não for o buffer fixo, deve ser um buffer alocado com o gestor de backups. Neste caso, o gestor de backup é usado para realocar o buffer.

Se o buffer a realocar for o buffer fixo e o novo tamanho do buffer for demasiado grande para caber dentro do buffer fixo, CFixedStringMgr aloca um novo buffer usando o gestor de backup. O conteúdo do buffer fixo é então copiado para o novo buffer.

Implementação do CFixedStringMgr::Free

A implementação de CFixedStringMgr::Free segue o mesmo padrão que Allocate e ReAllocate. Se o buffer libertado for o buffer fixo, o método define para um buffer bloqueado de comprimento zero. Se o buffer libertado foi alocado com o gestor de backups, CFixedStringMgr usa o gestor de backup para o libertar.

Implementação de CFixedStringMgr::Clone

A implementação de CFixedStringMgr::Clone devolve sempre um ponteiro para o gestor de backups em vez de para o CFixedStringMgr próprio gestor. Isto acontece porque cada instância de CFixedStringMgr só pode ser associada a uma única instância de CStringT. Qualquer outra tentativa de CStringT clonar o gestor deve receber o gestor de backup. Isto porque o gestor de backup suporta a partilha.

Implementação de CFixedStringMgr::GetNilString

A implementação de CFixedStringMgr::GetNilString devolve o buffer fixo. Devido à correspondência um a um de CFixedStringMgr e CStringT, uma dada instância de CStringT nunca usa mais do que um buffer de cada vez. Portanto, nunca são necessários um string nil e um verdadeiro string buffer ao mesmo tempo.

Sempre que o buffer fixo não está em uso, CFixedStringMgr assegura-se que é inicializado com comprimento zero. Isto permite que seja usada como a corda nul. Como bónus adicional, o nAllocLength elemento do buffer fixo é sempre definido para o tamanho total do buffer fixo. Isto significa que CStringT pode crescer a cadeia sem chamar IAtlStringMgr::Reallocate, mesmo para a cadeia nil.

Requerimentos

Cabeçalho: cstringt.h

Consulte também

Gestão de Memória com CStringT