Удаление синглтонов
Попробуйте покопать в направлении использовании функции atexit() — эта функция регистрирует пользовательские функции, которые вызываются при выходе из приложения. А вообще, если много синглтонов — посмотрите реализацию у Александреску в библиотеке Loki
Если при удалении возникает что-то наподобие static initialization order fiasco (из-за неопределенного порядка удаления синглтонов возникают ошибки), то можно поместить все синглтоны в один объект, как поля — тогда они будут удалятся в обратном порядке объявления.

Удобнее всего использовать RAII — выделять память в конструкторе, а удалять в деструкторе, тогда и Terminate не понадобится. Конечно это не всегда получается, но в-основном именно так.

Динамически выделяемую память лучше всего хранить в shared_ptr, он реализует RAII.