La prima cosa da no è che stai derivando std::basic_stringbuf<char>
Per qualsiasi motivo senza prevalere su tutte le funzioni virtuali pertinenti. Ad esempio, non sovrascrivi xsputn()
o sync()
: Qualunque cosa queste funzioni finiscano per fare, erediterai. Consiglio vivamente di derivare il tuo buffer di streaming std::basic_streambuf<char>
invece!
Il overflow()
Il metodo annuncia un buffer che è un carattere più piccolo della stringa al buffer del flusso: &buffer.back()
non è un puntatore alla fine dell'array ma all'ultimo carattere nella stringa. Personalmente, lo userei
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
Finora non ci sono problemi. Tuttavia, dopo aver fatto spazio per più personaggi che hai omesso aggiungendo il personaggio traboccante, cioè l'argomento passato a overflow()
al buffer:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Ci sono alcune altre piccole cose che non hanno ragione:
- È generalmente una cattiva idea dare prevalente
virtual
Funzioni un parametro predefinito. La funzione di classe base fornisce già il valore predefinito e il nuovo impostazione predefinita viene raccolto solo quando la funzione viene mai chiamata esplicitamente. La stringa restituita può contenere un numero di caratteri null alla fine perché la stringa trattenuta è in realtà più grande della sequenza che è stata scritta finora a meno che il buffer non sia esattamente pieno. Probabilmente dovresti implementare il
str()
funzione in modo diverso:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- Crescere la stringa di un valore costante è un grave problema di prestazioni: il costo della scrittura
n
i personaggi sonon * n
. Per più granden
(Non hanno davvero bisogno di diventare enormi) Questo causerà problemi. Stai molto meglio a far crescere il tuobuffer
esponenzialmente, ad esempio, raddoppiandolo ogni volta o crescere di un fattore di1.5
Se ti senti raddoppiare non è una buona idea.