Недавно у меня было собеседование, и меня попросили внедрить класс циклического буфера. Требовалось не использовать какие-либо контейнеры (включая STL).
Следовал мой код:
template<class T>
class CircularFifo
{
T * _data;
size_t _size;
size_t _read; // last readen elem
size_t _write; // next write index
CircularFifo(CircularFifo const &) = delete;
CircularFifo & operator=(CircularFifo const &) = delete;
CircularFifo(CircularFifo &&) = delete;
CircularFifo & operator=(CircularFifo &&) = delete;
public:
explicit inline
CircularFifo(size_t size = 2048)
: _data(new T[size])
, _size(size)
, _read(-1)
, _write(0)
{
if (0 == _size)
{
throw std::runtime_error("too empty buffer");
}
if (1 == _size)
{
throw std::runtime_error("too short buffer");
}
if (-1 == size)
{
throw std::runtime_error("too huge buffer");
}
}
inline ~CircularFifo()
{
delete []_data;
}
inline T read()
{
if (_read == _write)
{
throw std::runtime_error("buffer underflow");
}
return _data[(++_read) % _size];
}
inline void write(T const & obj)
{
if (_read == _write)
{
throw std::runtime_error("buffer overflow");
}
_data[(_write++) % _size] = obj;
}
};
Интервьюер грустно, что стиль кодирования в порядке. Но в буфере есть ошибка, которая сделает этот класс ненадежным. Она попросила меня найти его, и я полностью потерпел неудачу. Она также не раскрыла мне эту ошибку.
Я снова проверил все: утечки, арифметику, возможные переполнения и т.д. Моя голова почти готова к взрыву. Я не знаю, где ошибка. Пожалуйста, помогите мне.
P.S. Извините за мой грязный английский.