Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Em situações especializadas, talvez você queira implementar um gerenciador de cadeia de caracteres personalizado que faça mais do que apenas alterar qual heap é usado para alocar memória. Nessa situação, você deve implementar manualmente a interface IAtlStringMgr como seu gerenciador de cadeia de caracteres personalizado.
Para fazer isso, é importante primeiro entender como o CStringT usa essa interface para gerenciar seus dados de cadeia de caracteres. Cada instância tem CStringT um ponteiro para uma estrutura CStringData. Essa estrutura de comprimento variável contém informações importantes sobre a cadeia de caracteres (como comprimento), bem como os dados de caractere reais da cadeia de caracteres. Cada gerenciador de cadeia de caracteres personalizado é responsável por alocar e liberar essas estruturas a pedido de CStringT.
A estrutura CStringData é composta por quatro campos:
pStringMgr Esse campo aponta para a interface
IAtlStringMgrusada para gerenciar esses dados de cadeia de caracteres. QuandoCStringTprecisar realocar ou liberar o buffer de cadeia de caracteres, ele chamará os métodos Reallocate ou Free dessa interface, passando a estruturaCStringDatacomo um parâmetro. Ao alocar uma estruturaCStringDatano gerenciador de cadeia de caracteres, você deverá definir esse campo para apontar para o gerenciador de cadeia de caracteres personalizado.nDataLength Esse campo contém o comprimento lógico atual da cadeia de caracteres armazenada no buffer, excluindo o nulo de encerramento.
CStringTatualiza esse campo quando o comprimento da cadeia de caracteres é alterado. Ao alocar uma estruturaCStringData, o gerenciador de cadeia de caracteres deverá definir esse campo como zero. Ao realocar uma estruturaCStringData, o gerenciador de cadeia de caracteres personalizado deverá deixar esse campo inalterado.nAllocLength Esse campo contém o número máximo de caracteres (excluindo o nulo de encerramento) que podem ser armazenados neste buffer de cadeia de caracteres sem realocá-lo. Sempre que
CStringTprecisar aumentar o comprimento lógico da cadeia de caracteres, ele primeiro verificará esse campo para verificar se há espaço suficiente no buffer. Se a verificação falhar,CStringTchamará o gerenciador de cadeia de caracteres personalizado para realocar o buffer. Ao alocar ou realocar uma estruturaCStringData, você deve definir esse campo como pelo menos o número de caracteres solicitados no parâmetro nChars para IAtlStringMgr::Allocate ou IAtlStringMgr::Reallocate. Se houver mais espaço no buffer do que o solicitado, você poderá definir esse valor para refletir a quantidade real de espaço disponível. Isso permite queCStringTaumente a cadeia de caracteres para preencher todo o espaço alocado antes de precisar chamar de volta para o gerenciador de cadeias de caracteres para realocar o buffer.nRefs Esse 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
CStringTestará usando o buffer. Além disso, a instância tem permissão para ler e modificar o conteúdo do buffer. Se o valor for maior que um, várias instâncias deCStringTpoderão usar o buffer. Como o buffer de caracteres é compartilhado, as instânciasCStringTsó podem ler o conteúdo do buffer. Para modificar o conteúdo,CStringTprimeiro faz uma cópia do buffer. Se o valor for negativo, apenas uma instância deCStringTestará usando o buffer. Nesse caso, o buffer é considerado bloqueado. Quando uma instânciaCStringTestiver usando um buffer bloqueado, nenhuma outra instância deCStringTpoderá compartilhar o buffer. Em vez disso, essas instâncias criam uma cópia do buffer antes de manipular o conteúdo. Além disso, a instânciaCStringTque usa o buffer bloqueado não tenta compartilhar o buffer de qualquer outra instânciaCStringTatribuída a ele. Nesse caso, a instânciaCStringTcopia a outra cadeia de caracteres no buffer bloqueado.Ao alocar uma estrutura
CStringData, você deverá definir esse campo para refletir o tipo de compartilhamento permitido para o buffer. Para a maioria das implementações, defina esse valor como um. Isso permite o comportamento usual de compartilhamento de cópia na gravação. No entanto, se o gerenciador de cadeias de caracteres não der suporte ao compartilhamento do buffer de cadeia de caracteres, defina esse campo como um estado bloqueado. Isso forçaCStringTa usar somente esse buffer para a instância doCStringTque o alocou.