Как в анекдоте (явно времён 70-х, когда между Гондурасом и Сальвадором была Футбольная война).
— Что-то меня беспокоит Гондурас.
— Так не чеши его.
Вызов деструктора каскадно вызовет деструкторы всех полей, и это приведёт к тому, что на месте u_m будет мусор вроде nullptr и висячих указателей.
Автодеструкторы — важнейшая фишка Си++, отличающая его от других языков, и явный вызов деструктора нужен
крайне редко, когда мы хотим чуть более ручное управление памятью. Вот пример из нашего проекта. Есть выделенный кусок памяти, и мы хотим уничтожить там объект и на его месте создать новый, не отдавая-выделяя память. Считаем, что объекты одинаковые, иначе вся магия пропадёт.
wiTile->~WiTile();
new (wiTile) WiTile(client(), icons, clazz, tileSettings(i));
В проекте на сотни тысяч строк я нашёл 34 таких места в библиотеках, в основном RapidJson, и три места собственно в программе.
Если хотите полностью очистить — делайте отдельную функцию clear.
Кстати, в вашем случае явно прописанный деструктор не нужен вообще. Вызываемые автоматически деструкторы полей сделают всё, что надо, чтобы корректно уничтожить его.