Angesichts des Codes
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;
ist die Verwendung von reinterpret_cast
in diesem Fall UB? Ich würde ja sagen, da memcpy
die Lebensdauer einer Instanz nicht beginnt und somit gegen die strenge Aliasing-Regel verstößt (weshalb std::bit_cast
C ++ 20 hinzugefügt wurde).
Und wenn ich die Besetzung durch eine andere ersetze memcpy
(um den Zeiger zu lesen), wäre das Programm gut definiert?
std::vector
? (Ich
A*
Objekt im Puffer befindet. Der Standard sagt über die Standardfunktion allocator :: allocate aus: "Rückgabe: Ein Zeiger auf das Anfangselement eines Arrays von Speichergrößen n * sizeof(T)
, das für Objekte vom Typ T entsprechend ausgerichtet ist ".
buffer.data()
, der angeblich einen Zeiger auf enthältA
, nichtbuffer.data()
selbst, der ein Zeiger auf istA
.