Вы испортили свою кучу, потому что ваше распределение неверно. А именно, учтите это:
template<class T>
T* Allocate(const std::size_t count)
{
return static_cast<T*>(::operator new(count));
}
Если count
равен единице, вы получите один байт. (Затем вы пытаетесь создать объект, размер которого в этой памяти больше единицы ... бум.)
Вы, вероятно, хотите:
template<class T>
T* Allocate(const std::size_t count)
{
return static_cast<T*>(::operator new(sizeof(T) * count));
}
Обратите внимание, что дизайн вашей функции немного необычен. Функции выделения и освобождения должны строго распределяться и освобождаться (без приведения!), Например:
template<class T>
void* Allocate(const std::size_t count)
{
return ::operator new(sizeof(T) * count);
}
void Deallocate(void* where_)
{
::operator delete(where_);
}
А ваши функции построения и разрушения должны быть теми, которые конструируют и возвращают объект, а также разрушают объект:
template<class T>
T* Construct(void* where_, const T& what)
{
return new (where_) T(what);
}