La première chose à ne pas, c'est que vous tirez std::basic_stringbuf<char>
pour une raison quelconque sans remplacer toutes les fonctions virtuelles pertinentes. Par exemple, vous ne remplacez pas xsputn()
ou sync()
: Quelles que soient ces fonctions, vous héritez. Je recommanderais fortement de dériver votre tampon de flux de std::basic_streambuf<char>
Au lieu!
La overflow()
La méthode annonce un tampon qui est un caractère plus petit que la chaîne du tampon de flux: &buffer.back()
n'est pas un pointeur vers la fin du tableau mais vers le dernier caractère de la chaîne. Personnellement, j'utiliserais
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
Il n'y a pas de problème jusqu'à présent. Cependant, après avoir fait de la place pour plus de personnages, vous avez omis d'ajouter le caractère débordant, c'est-à-dire que l'argument a passé overflow()
au tampon:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Il y a quelques autres petites choses qui ne sont pas tout à fait correctes:
- C'est généralement une mauvaise idée de donner un versement
virtual
Fonctionne un paramètre par défaut. La fonction de classe de base fournit déjà la valeur par défaut et la nouvelle valeur par défaut n'est ramassée que lorsque la fonction est jamais appelée explicitement. La chaîne renvoyée peut contenir un certain nombre de caractères nuls à la fin car la chaîne maintenue est en fait plus grande que la séquence qui a été écrite jusqu'à présent à moins que le tampon soit exactement plein. Vous devriez probablement implémenter le
str()
fonction différemment:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- La croissance de la chaîne par une valeur constante est un problème de performance majeur: le coût de l'écriture
n
Les personnages sontn * n
. Pour plus grandn
(Ils n'ont pas vraiment besoin de devenir énormes) Cela causera des problèmes. Vous feriez beaucoup mieux de développer votrebuffer
De façon exponentielle, par exemple, le doubler à chaque fois ou la croissance d'un facteur de1.5
Si vous sentez que doubler n'est pas une bonne idée.