Lo primero que no es no es que estés derivando de std::basic_stringbuf<char>
por alguna razón sin anular todas las funciones virtuales relevantes. Por ejemplo, no anulas xsputn()
o sync()
: Cualquiera que sea que estas funciones terminen haciendo, heredarás. Recomiendo encarecidamente derivar su búfer de flujo de std::basic_streambuf<char>
¡en cambio!
los overflow()
El método anuncia un búfer que es un personaje más pequeño que la cadena al búfer de transmisión: &buffer.back()
No es un puntero al final de la matriz sino al último carácter de la cadena. Personalmente, usaría
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
No hay problema hasta ahora. Sin embargo, después de hacer espacio para más personajes, omitiste agregar el personaje desbordante, es decir, el argumento pasó a overflow()
al búfer:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Hay algunas pequeñas cosas más que no son del todo correctas:
- Generalmente es una mala idea dar anulación
virtual
Funciona un parámetro predeterminado. La función de clase base ya proporciona el valor predeterminado y el nuevo valor predeterminado solo se recoge cuando la función se llama explícitamente. La cadena devuelta puede contener una serie de caracteres nulos al final porque la cadena retenida es en realidad más grande que la secuencia que se escribió hasta ahora a menos que el búfer esté exactamente lleno. Probablemente debería implementar el
str()
funcionar de manera diferente:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- El crecimiento de la cadena por un valor constante es un problema de rendimiento importante: el costo de la escritura
n
Los personajes sonn * n
. Para más granden
(Realmente no necesitan ser enormes) Esto causará problemas. Eres mucho mejor al cultivar tubuffer
exponencialmente, por ejemplo, duplicarlo cada vez o crecer por un factor de1.5
Si sientes que duplicar no es una buena idea.