В вашем коде есть 3 вида неопределенного поведения.
Во-первых, вы делаете вид, что есть объект в месте, где его нет. Вы никогда не создавали mystruct
; Вы только что выделили несколько байтов памяти. Просто сделать reinterpret_cast
недостаточно для создания mystruct
. Таким образом, любое использование pointer
, которое обращается к «объекту», который не существует, является UB.
Во-вторых, даже если он был в этом буфере, mystruct
не может быть просто скопирован, поэтому вы не можете просто скопировать его байты. Вы не можете прочитать кучу байтов в нетривиально копируемый объект. Именно наличие нетривиально копируемого нестатического элемента данных (то есть: mystruct::string
) делает его нетривиально копируемым.
И в-третьих, вы пытаетесь удалить это mystruct
. Но там нет mystruct
, вы удаляете то, что не существует. Технически, это, вероятно, покрыто # 1, но это, вероятно, то, что приводит к полному краху вашего кода.
Если вы знаете, почему «без проблем с чтением данных структуры» сработало, вполне вероятно, что реализация std::string
использует оптимизацию небольших строк, которая хранит строку внутри самого std::string
, если она достаточно мала , Для небольших строк выполнение побайтной копии, вероятно, достаточно близко к «работе», чтобы вы могли читать строковые данные.
Но это просто повезло.