Начну со второго вопроса.
"Почему размер объекта отличается?" - ключ virtual
здесь.
Каждый class
/ struct
, в котором есть виртуальная функция, содержит указатель на виртуальную таблицу.
В этом случае размер M будет равен размеру указателя на вашей машине.
Я предполагаю, что у вас есть 64-битная машина, а размер указателя равен 8 байтов.
В примере, где ключевое слово «virtual» было удалено, размер пустого класса составляет 1 байт.
Подробнее о виртуальных функциях и таблицах вы можете прочитать здесь:
https://pabloariasal.github.io/2017/06/10/understanding-virtual-tables/
О вашем первом вопросе о повторном использовании адресной памяти в куче
Я настоятельно рекомендую вам прочитать первую часть
https://azeria -labs.com / кучного эксплуатации частей-1-понимание-заместитель Glibc-кучного реализация /
Вкратце, выделение памяти выполняется чанком.
В первом примере (с виртуальным деструктором) оба класса расширяются указателем на виртуальную таблицу.
Новая выделенная память не помещается в освобожденную часть памяти, поэтому новый адрес найден.
Во втором случае новая выделенная память помещается в освобожденное пространство и используется повторно.
Вы можете попытаться перекомпилировать ваш пример с виртуальной функцией, но с удаленным long d
из struct C
. Может оказаться, что адрес теперь будет прежним.