Если при удалении возникает что-то наподобие static initialization order fiasco (из-за неопределенного порядка удаления синглтонов возникают ошибки), то можно поместить все синглтоны в один объект, как поля — тогда они будут удалятся в обратном порядке объявления.
Удобнее всего использовать RAII — выделять память в конструкторе, а удалять в деструкторе, тогда и Terminate не понадобится. Конечно это не всегда получается, но в-основном именно так.
Динамически выделяемую память лучше всего хранить в shared_ptr, он реализует RAII.