Packet
имеет деструктор, даже если вы явно не объявили его. У него есть деструктор по умолчанию. Деструктор по умолчанию, вероятно, на самом деле ничего не делает, но вы не можете рассчитывать на это. То, что он делает, зависит от компилятора.
new
и malloc
также могут иметь совершенно разные реализации. Например, delete всегда вызывается в контексте, в котором содержится точная информация о размере структуры данных, которую он удаляет во время компиляции. free
не имеет этой роскоши. Возможно, что используемый new
распределитель может не хранить байты в начале области памяти, указывающей, сколько байтов он занимает. Это может привести к тому, что free
сделает что-то не так, и ваша программа потерпит крах при освобождении чего-либо, выделенного с помощью new
.
Лично, если заставить людей делать правильные вещи или исправить код самостоятельно совершенно невозможно, я бы объявил свой глобальный operator new
, который вызывал malloc
, так что free
точно не потерпел бы крах, даже если бы все равно не вызывай деструктора и будь вообще по-настоящему уродливым.