¿Es peligroso usar una ubicación nueva en un objeto antiguo sin llamar explícitamente al destructor primero?

Me gustaría reciclar la memoria de un objeto en lugar de desasignarlo y reconstruirlo. ¿Es seguro el siguiente uso de "colocación nueva", suponiendo queFoo en la práctica no contiene punteros (pero puede contener funciones)?

Además, es la final.delete llame seguro, y ¿llamará correctamente al destructor en el segundo "nuevo" objeto, y luego liberará correctamente la memoria?

#include <new>
struct Foo {
    int hello;
    int world;
};

int main() {
    Foo* foo = new Foo;
    // Do something with foo
    // Done with foo, writing a new version of foo on top of the old one.
    new(foo) Foo();

    delete(foo);
}

El ejemplo simple anterior compila y ejecuta sin errores, pero no puedo decir si lo ejecuto por algún motivo en un entorno más complejo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta