Первое, чего не нужно, это то, что вы получаете std::basic_stringbuf<char>
По какой -то причине, не переопределяя все соответствующие виртуальные функции. Например, вы не переопределяете xsputn()
или же sync()
: Что бы ни делали эти функции, вы унаследовали. Я настоятельно рекомендую вывести ваш буфер потока std::basic_streambuf<char>
вместо!
А overflow()
Метод объявляет буфер, который является одним символом, меньше, чем строка в буфере потока: &buffer.back()
Не указатель на конец массива, а к последнему символу в строке. Лично я бы использовал
this->setp(&this->buffer.front(), &this->buffer.front() + this->buffer.size());
Пока нет проблем. Однако, запустив место для большего количества символов, которые вы опустили, добавив переполненный символ, т.е. аргумент передан overflow()
в буфер:
this->pbump(diff);
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
Есть еще несколько мелочей, которые не совсем правильно:
- Как правило, плохая идея - дать перейти
virtual
Функции параметр по умолчанию. Функция базового класса уже обеспечивает по умолчанию, а новое значение по умолчанию поднимается только тогда, когда функция когда -либо называется явно. Возвращенная строка может содержать несколько нулевых символов в конце, потому что удерживаемая строка на самом деле больше, чем последовательность, которая была записана до сих пор, если буфер не заполнен. Вы, вероятно, должны реализовать
str()
функционируйте по -другому:std::basic_string<charT> str() const { return this->buffer.substr(0, this->pptr() - this->pbase()); }
- Выращивание строки постоянной ценой является основной проблемой производительности: стоимость написания
n
персонажи естьn * n
. Анкет Для большегоn
(Им действительно не нужно становиться огромным) Это вызовет проблемы. Вам намного лучше выращиватьbuffer
в геометрической прогрессии, например, удваивает его каждый раз или растут в1.5
Если вы чувствуете, что удвоение - не очень хорошая идея.