Yup- a pool should not have any outstanding allocations when it is being finalized, or else that memory will be permanently lost to the process. Call pool.Clear() to drop all allocations. BufferPool's explicitly implemented Dispose function just calls Clear.
(Notably, if the process is shutting down, clearing the allocations isn't technically required. The OS will free up all the memory.)