Стандарт C ++ требует, чтобы удаление вызывалось компилятором.
Стандартный раздел C +, который обращается к этому:
15.2 Конструкторы и деструкторы
1 Когда управление переходит от бросающего выражения к обработчику, деструкторы вызываются для всех автоматических объектов, созданных с момента ввода блока try. Автоматические объекты уничтожаются в порядке, обратном завершению их строительства.
2 Объект, который частично построен или частично разрушен, будет иметь деструкторы, выполняемые для всех его полностью построенных базовых классов и не вариантных членов, то есть для подобъектов, для которых главный конструктор (12.6. 2) завершил выполнение, а деструктор еще не начал выполнение. Точно так же, если не делегирующий конструктор для объекта завершил выполнение и делегирующий конструктор для этого объекта завершается с исключением, будет вызван деструктор объекта. Если объект был выделен в новом выражении, соответствующая функция освобождения (3.7.4.2, 5.3.4, 12.5), если таковая имеется, вызывается для освобождения памяти, занятой объектом.
3 Процесс вызова деструкторов для автоматических объектов, созданных на пути от блока try к throwexpression, называется «размоткой стека». [Примечание: если деструктор, вызванный во время разматывания стека, завершается с исключением, std: : прекращение называется (15.5.1). Таким образом, деструкторы должны, как правило, перехватывать исключения и не позволять им распространяться за пределы деструктора. —Конечная записка]