The standard heap mechanisms reuse memory after it is released; a single address range may be used by many different values over the lifetime of a program. However, as you suggest, such mechanisms do acquire memory from the system as needed at runtime.
If you need to preallocate a suitable size chunk of memory and then dole out allocations from that, you'd be looking at sensitive stuff like overloading global operator new
and its friends to do allocation out of the preallocated space, presumably throwing exceptions when the preallocated space runs out. [Don't try this without adult supervision - and don't look to me for that supervision; I'm a chicken!]