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_cast
en este caso UB? Yo diría que sí, porque memcpy
no comienza la vida útil de una instancia, por lo tanto, viola la estricta regla de alias (por eso std::bit_cast
se 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
.