Partilhar via


Implementação de um gerente personalizado de cadeia de caracteres (método poderoso)

Em situações especializadas, você talvez queira implementar um gerente personalizado de cadeia de caracteres que se faz mais do que apenas a alteração que o heap é usado para alocar memória.Em esta situação, você deve manualmente implementar a interface de IAtlStringMgr como seu gerente personalizado de cadeia de caracteres.

Para fazer isso, é importante principalmente para compreender como os usos de CStringT qual interface para gerenciar seus dados de cadeia de caracteres.Cada instância de CStringT tem um ponteiro a estrutura de CStringData .Essa estrutura de comprimento variável contém informações importantes sobre a cadeia de caracteres (como o comprimento), assim como os dados reais de caracteres para a cadeia de caracteres.Cada gerente personalizado de cadeia de caracteres é responsável para atribuir e liberar essas estruturas aplicativo da CStringT.

A estrutura de CStringData inclui quatro campos:

  • pStringMgr pontos de este campo para a interface de IAtlStringMgr usada para gerenciar esses dados de cadeia de caracteres.Quando as necessidades de CStringT de realocar ou liberar o buffer de cadeia de caracteres ele chamarem realocar ou liberarem os métodos de essa interface, passando a estrutura de CStringData como um parâmetro.Para atribuir uma estrutura de CStringData no gerenciador de cadeia de caracteres, você deve definir este campo para apontar para o gerenciador personalizado de cadeia de caracteres.

  • nDataLength este campo contém o comprimento atual lógico de cadeia de caracteres armazenados em buffer excluindo de terminação do zero.CStringT atualiza este campo quando o comprimento da cadeia de caracteres é alterado.Para atribuir uma estrutura de CStringData , o gerenciador de cadeia de caracteres deve definir este campo como zero.Para realocar uma estrutura de CStringData , o gerenciador personalizado de cadeia de caracteres deve deixar este campo inalterado.

  • nAllocLength este campo contém o número máximo de caracteres (excluindo de terminação de zero) que podem ser armazenados no buffer de cadeia de caracteres sem o realocar.Sempre que as necessidades de CStringT de aumentar o tamanho lógico de cadeia de caracteres, ele verifique primeiro este campo para verificar se há espaço suficiente no buffer.Se a verificação falhar, chamadas de CStringT em seu gerente personalizado de cadeia de caracteres para realocar o buffer.Quando atribuir ou realocar uma estrutura de CStringData , você deve definir este campo pelo menos ao número de caracteres aplicativos no parâmetro de nChars a IAtlStringMgr::Allocate ou a IAtlStringMgr::Reallocate.Se houver mais espaço no buffer do solicitado, você pode definir esse valor para refletir a quantidade de espaço disponível real.Isso permite que CStringT aumenta a cadeia de caracteres para preencher o espaço alocado antes que tenha que chame de novo no gerenciador de cadeia de caracteres para realocar o buffer.

  • nRefs este campo contém a contagem de referência atual do buffer de cadeia de caracteres.Se o valor for um, uma única instância de CStringT estiver usando o buffer.Além de isso, é permitida quando ler e altera à instância o conteúdo do buffer.Se o valor for maior de um, várias instâncias de CStringT podem usar o armazenamento.Porque o buffer de caracteres é compartilhado, instâncias de CStringT só podem ler o conteúdo do buffer.Para alterar o conteúdo, CStringT primeiro faz uma cópia do buffer.Se o valor for negativo, somente uma instância de CStringT estiver usando o buffer.Em esse caso, o buffer é considerado bloqueado.Quando uma instância de CStringT estiver usando um buffer bloqueado qualquer outras instâncias de CStringT podem compartilhar o buffer.Em vez de isso, essas instâncias criar uma cópia do buffer antes de manipular o conteúdo.Além de isso, a instância de CStringT que usa o buffer bloqueado não tenta compartilhar o buffer de qualquer outra instância de CStringT atribuído a ele.Em esse caso, a instância de CStringT copiar outra cadeia de caracteres em buffer bloqueado.

    Para atribuir uma estrutura de CStringData , você deve definir este campo para refletir o tipo de compartilhar que é permitido o buffer.Para a maioria das implementações, defina esse valor para um.Isso permite a cópia-em- gravação comum que compartilham o comportamento.Em o entanto, se o gerenciador de cadeia de caracteres não suporta compartilhar o buffer de cadeia de caracteres, defina este campo em um estado bloqueado.Isso força CStringT para usar apenas este buffer para a instância de CStringT que o atribuiu.

Consulte também

Conceitos

Gerenciamento de memória com CStringT