По сути, всякий раз, когда вы хотите, чтобы какой-то другой класс отвечал за жизненный цикл объектов вашего класса, или у вас есть причина предотвратить уничтожение объекта, вы можете сделать деструктор приватным.
Например, если вы выполняете какие-то операции подсчета ссылок, вы можете поручить объекту (или менеджеру, который был «другом») отвечать за подсчет количества ссылок на себя и удалять его, когда число достигает нуль. Закрытый dtor не позволит кому-либо удалить его, если на него еще есть ссылки.
В другом случае, что если у вас есть объект, имеющий менеджера (или самого себя), который может уничтожить его или может отказаться уничтожить его в зависимости от других условий в программе, таких как открытое соединение с базой данных или файл написано. В классе или у менеджера может быть метод request_delete, который проверит это условие, удалит или отклонит его и вернет состояние, сообщающее, что он сделал. Это гораздо более гибко, чем просто вызывать «удалить».