Я думаю, что факт целочисленного члена, вызывающего сбой памяти, это просто вопрос «удачи». Я имею в виду, если ваш деструктор в базовом классе не является виртуальным, «уничтожение» D не вызывается.
Итак, в памяти ваш объект D в кучах может выглядеть так:
Object D
+-----------+
| B subobj. |
+-----------+
| D members |
+-----------+
Если деструктор B не является виртуальным и если вы удалите базу указателей на B
, то часть D
не будет уничтожена. В вашем случае, часть D
имеет размер 0, а часть B
имеет размер sizeof(int)
(4 байта), и это делает ситуацию немного более сложной для «угадывания», но, возможно, ваш компилятор добавляет дополнительная информация по любой причине к вашим объектам в памяти.
Итак, после удаления b
, но до конца приложения, возможно, какой-то фрагмент кода, добавляемый компилятором во время выхода, вызывает сбой из-за вашего неуместного удаления b
(повторное использование этого часть памяти, например или что-то в этом роде).
Поскольку ваш код очень короткий, вы можете проверить поведение своего кода с помощью 'gdb' на уровне сборки в интервале между удалением b
и завершением вашего кода.