Missed the Deleter injection in deallocate:

    void deallocate(asio::buffer *b) {
        this->buffers.push_front(buffer_ptr(b));
    }

Should be:

    void deallocate(asio::buffer *b) {
        this->buffers.push_front(buffer_ptr(b, PoolBufferDeleter(shared_from_this())));
    }