C++ keeps two clocks for every object: when its memory exists, and when an object actually lives in that memory. Placement new, allocators, vector growth and most dangling-pointer bugs make sense once you can see both.
The piece below is interactive. It covers where storage comes from and the four storage durations, the four primitive operations that allocation and construction decompose into, construction and destruction order under a throwing constructor, which of six pointers dangle, what std::vector does to your objects when it grows, how many times operator new runs in a push loop, and a pool that reuses storage without ever calling the allocator. Step the traces, drag the sliders, push the vector around.
The visualisation is also on its own page if you want it full width.