Да, этот код имеет неопределенное поведение. В месте, указанном buffer.data()
, нет объекта типа A*
. Все, что вы сделали, это скопировали объектное представление такого указателя в ваш вектор [basi c .types] / 4 . Поскольку указатели легко копируются [basi c .types] / 9 , если вы скопируете эти байты обратно в реальный объект типа A*
, а затем delete
значение этого, то будет четко определено [basi c .types] / 3 . Так что это
A* ptr;
std::memcpy(&ptr, buffer.data(), sizeof(ptr));
delete ptr;
было бы хорошо.
Обратите внимание, что не само приведение вызывает неопределенное поведение в вашем исходном примере, а ваша последующая попытка прочитать значение объекта типа A*
который не существует там, где указатель получен через точки приведения. Все существует там, где указатель указывает на последовательность объектов типа unsigned char
. Тип A*
не является типом, который вы можете использовать для доступа к сохраненному значению объекта типа unsigned char
[basi c .lval] / 8 …