Manual lifetime management and creating objects inside untyped memory blocks is a very niche topic.
However, there are situations when std::vector isn't sufficient.
Fortunately, the C++ standard library offers a set of uninitialized algorithms that provide default, copy, move and value construction and destruction on top of raw memory.
Compiler Explorer link: https://compiler-explorer.com/z/bqeG1oaG9