Dado o 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;
é o uso de reinterpret_cast
, neste caso, UB? Eu diria que sim, porque memcpy
não inicia o tempo de vida de uma instância, violando a regra estrita de alias (por isso std::bit_cast
foi adicionada ao C ++ 20).
E se eu substituir o elenco por outro memcpy
(para ler o ponteiro) o programa estaria bem definido?
std::vector
? (Presumo suas garantias são quaisquer que sejam suas garantias alocador.)
A*
objeto no buffer. O padrão diz sobre a função alocador padrão :: alocar: "Retorna: um ponteiro para o elemento inicial de uma matriz de armazenamento de tamanho n * sizeof(T)
, alinhado adequadamente para objetos do tipo T ".
buffer.data()
que supostamente contém um ponteiro paraA
, e nãobuffer.data()
ele mesmo que é um ponteiro paraA
.