CFixedStringT: Exemplo de um gerente de string personalizado
A Biblioteca ATL implementa um exemplo de um Gerenciador de seqüência personalizada usado pela classe CFixedStringT, called CFixedStringMgr.CFixedStringT é derivado de CStringT e implementa uma seqüência de caractere que aloca seus dados de caractere sistema autônomo parte do CFixedStringT objeto propriamente dito, desde que a seqüência de caractere seja menor do que o comprimento especificado pela t_nChars parâmetro de modelo de CFixedStringT. Com essa abordagem, a seqüência de caracteres não é necessário o heap, a menos que o comprimento da seqüência de caracteres cresce além do dimensionar do buffer fixo.Porque CFixedStringT faz uso nem sempre um heap alocar seus dados de seqüência de caracteres, não é possível usar CAtlStringMgr sistema autônomo seu Gerenciador de seqüência de caracteres.Ele utiliza um Gerenciador de seqüência de caracteres personalizada (CFixedStringMgr), Implementando o IAtlStringMgr interface.Essa interface é discutida no Implementação do Manager um personalizado String (método avançado).
O construtor para CFixedStringMgr usa três parâmetros:
pData: Um ponteiro para o fixoCStringData estrutura a ser usado.
nChars: O número máximo de caracteres a CStringData estrutura pode armazenar.
**pMgr: **Um ponteiro para o IAtlStringMgrinterface de "Gerenciador de seqüência de caracteres de backup".
O construtor armazena os valores de pData e pMgr em seus respectivo membro variáveis (m_pData e m_pMgr).Em seguida, define o comprimento do buffer de zero, o comprimento disponível igual ao dimensionar máximo do buffer fixo e a contagem de referência como – 1.O valor de contagem de referência indica o buffer está bloqueado e para usar esta instância de CFixedStringMgr sistema autônomo o Gerenciador de seqüência de caracteres.
O buffer de marcação sistema autônomo travada impede que outros CStringT instâncias do que contém uma referência para o buffer compartilhada. Se outros CStringT instâncias foram permitidas para compartilhar o buffer seria possível para o buffer contido em CFixedStringT a ser excluído enquanto outras strings ainda estavam usando o buffer.
CFixedStringMgr é uma implementação completa do IAtlStringMgr interface. A implementação de cada método é discutida separadamente.
Implementação de CFixedStringMgr::alocar
A implementação de CFixedStringMgr::alocar primeiro verifica se o dimensionar solicitado da seqüência de caracteres é menor ou igual ao dimensionar do buffer fixo (armazenado no m_pData membro). Se o buffer fixo é grande o suficiente, CFixedStringMgr bloqueia o buffer fixo com comprimento zero.sistema autônomo longo sistema autônomo o comprimento da seqüência de caracteres não crescer além do dimensionar do buffer fixo, CStringT não terão a realocar o buffer.
Se o dimensionar solicitado da seqüência de caracteres for maior que o buffer fixo de CFixedStringMgr encaminha a solicitação para o Gerenciador de seqüência de caracteres de backup.O Gerenciador de seqüência de caracteres de backup é provável que ele para alocar o buffer da pilha.No entanto, retornando antes desse buffer CFixedStringMgr bloqueia o buffer e substitui seqüência de caracteres Gerenciador ponteiro do buffer de por um ponteiro para o CFixedStringMgr objeto.Isso garante que as tentativas de realocar ou disponível buffer por CStringT chamará CFixedStringMgr.
Implementação de CFixedStringMgr::ReAllocate
A implementação de CFixedStringMgr::ReAllocate é muito semelhante a sua implementação de Alocar.
Se o buffer sendo realocado é buffer fixo e os solicitados dimensionar do buffer é menor do que o buffer fixo, não é feita nenhuma alocação de.No entanto, se o buffer sendo realocado não é buffer fixo, ele deve ser um buffer alocado com o Gerenciador de backup.Nesse caso, o Gerenciador de backup é usado para realocar o buffer.
Se o buffer sendo realocado é buffer fixo e o novo dimensionar do buffer é muito grande ajuste no buffer fixo, de CFixedStringMgr aloca um novo buffer usando o Gerenciador de backup.O Sumário do buffer fixo, em seguida, é copiado para o novo buffer.
Implementação de CFixedStringMgr::disponível
A implementação de CFixedStringMgr::disponível segue o mesmo padrão de Alocar and ReAllocate. Se o buffer sendo liberado buffer fixo, o método o define para um buffer bloqueado de comprimento zero.Se o buffer que está sendo liberado foi alocado com o Gerenciador de backup, CFixedStringMgr usa o Gerenciador de backup para liberá-la.
Implementação de CFixedStringMgr::Clone
A implementação de CFixedStringMgr::Clone sempre retorna um ponteiro para o Gerenciador de backup em vez do CFixedStringMgr propriamente dito.Isso acontece porque todas as ocorrências de CFixedStringMgr só pode ser associado uma única instância de CStringT. Qualquer Outros instâncias de CStringT tentando clonar o gerente deve obter o Gerenciador de backup. Isso ocorre porque o Gerenciador de backup oferece suporte a que está sendo compartilhado.
Implementação de CFixedStringMgr::GetNilString
A implementação de CFixedStringMgr::GetNilString retorna buffer fixo.Por causa da correspondência de individuaisCFixedStringMgr and CStringT, uma determinada instância de CStringT nunca usa mais de um buffer ao mesmo time. Portanto, uma seqüência de caracteres nil e um buffer de cadeia de caracteres reais nunca são necessários ao mesmo time.
Sempre que o buffer fixo não está em uso, CFixedStringMgr garante que ele é inicializado com um comprimento igual a zero.Isso permite que ele seja usado sistema autônomo a seqüência de caracteres nil.sistema autônomo um bônus adicional, a nAllocLength membro do buffer fixo é sempre definido sistema autônomo o dimensionar total do buffer fixo. Isso significa que CStringT pode crescer a seqüência de caracteres sem chamada IAtlStringMgr::Reallocate, até mesmo para a seqüência de caracteres nil.
Requisitos
Cabeçalho: cstringt.h