It does not work this way. You use the placement new. The first parameter to that new is the a pointer to the memory location where the object is stored. There will be no further memory allocation, but the constructor of the object will be called. Thus the content of heap will be overwritten with 0.
This
auto x = new (&heap) int(0);
might cause undefined behavior if there is not enough memory reserved on the stack for the int.