Well, why did they have to restart if they never made any further allocations? This does not add up.
Just because you "preallocate" it doesn't mean that you don't implement a poor man's allocator inside the preallocated buffer.
I buy all the groceries I need from now until the end of time. That's not realistically achievable, from any perspective.
Allocating all the memory you need for a day is realistically achievable. Allocating all the memory you need until the end of time is not realistically achievable.
Still sounds like a leak to me.
It's a perfectly fine way of engineering a system.
There's also a variant of this that's been used on missiles - basically, you put enough RAM on the weapon to guarantee it'll hit its target or run out of fuel before running out of memory.
(Yes, talking about Erlang/OTP here.)
I once was tracking a white whale of a memory leak. Along the way I was able to optimize memory usage of the leaked objects. So I got to the point where I thought maybe the leak was caused by simultaneous read, update, and delete operations on a single key, but by then I'd improved memory usage such that weekly, rather than nightly restarts were needed. The futures markets at the time were 24/7 but with a maintenance period on the weekends, so my boss just told me to leave it and let the restarts garbage collect.
Trading firms can restart their software to fix the memory leaks.