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_castin diesem Fall UB? Ich würde ja sagen, da memcpydie Lebensdauer einer Instanz nicht beginnt und somit gegen die strenge Aliasing-Regel verstößt (weshalb std::bit_castC ++ 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.