ScratchAllocator::deallocate() runs into endless loop if buffer is used up exactly to the end
If the internal buffer is filled with allocations exactly to the end, so that _allocate == _end, the loop in memory.cpp, line 192 never returns, because _free will never reach _allocate.
Proposed solution: add a check in allocate(), just before assigning to _allocate:
... if (p == _end) p = _begin; _allocate = p; return data; }
BTW: I think the loop in deallocate() does a load-hit-store on _free, so perhaps using a local variable would improve performance if there are a lot of small allocations in the default scratch allocator.