Dado el código
struct A {};
auto obj = new A;
std::vector<unsigned char> buffer;
buffer.resize(sizeof(obj));
std::memcpy(buffer.data(), &obj, sizeof(obj)); // this copies the pointer, not the object!
// ...
auto ptr = *reinterpret_cast<A**>(buffer.data()); // is this UB?
delete ptr;
Cuál es el uso de reinterpret_casten este caso UB? Yo diría que sí, porque memcpyno comienza la vida útil de una instancia, por lo tanto, viola la estricta regla de alias (por eso std::bit_castse ha agregado a C ++ 20).
Y si reemplazo el elenco con otro memcpy(para leer el puntero), ¿estaría bien definido el programa?
std::vector? (Supongo que sus garantías son cualesquiera que sean las garantías de su asignador.)
A*objeto en el búfer. El estándar dice acerca de la función allocator :: allocate estándar: "Devuelve: Un puntero al elemento inicial de una matriz de almacenamiento de tamaño n * sizeof(T), alineado apropiadamente para objetos de tipo T ".
buffer.data()que supuestamente contiene un puntero aA, no es abuffer.data()sí mismo a lo que apuntaA.