A primeira coisa a não ser que você está derivando std::basic_stringbuf<char>
por qualquer motivo, sem substituir todas as funções virtuais relevantes. Por exemplo, você não substitui xsputn()
ou sync()
: Quaisquer que sejam essas funções, você herdará. Eu recomendo fortemente derivar seu buffer de fluxo de std::basic_streambuf<char>
em vez de!
o overflow()
O método anuncia um buffer que é um caractere menor que a corda do buffer de fluxo: &buffer.back()
Não é um ponteiro para o final da matriz, mas para o último personagem na string. Pessoalmente, eu usaria
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
Até agora, não há problema. No entanto, depois de abrir espaço para mais personagens que você omitiu adicionando o personagem transbordante, ou seja, o argumento passou para overflow()
para o buffer:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Existem mais algumas pequenas coisas que não estão certas:
- Geralmente é uma má ideia dar a substituição
virtual
Funções Um parâmetro padrão. A função de classe base já fornece o padrão e o novo padrão é retirado apenas quando a função é sempre chamada explicitamente. A string retornada pode conter vários caracteres nulos no final, porque a string mantida é realmente maior que a sequência que foi escrita até agora, a menos que o buffer esteja exatamente cheio. Você provavelmente deve implementar o
str()
função de maneira diferente:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- O crescimento da corda por um valor constante é um grande problema de desempenho: o custo de escrita
n
Os personagens sãon * n
. Para maiorn
(Eles realmente não precisam se tornar enormes) Isso causará problemas. Você está muito melhor crescendo seubuffer
exponencialmente, por exemplo, dobrando -o toda vez ou crescendo por um fator de1.5
Se você sente dobrar, não é uma boa ideia.