Какая польза от деструктора как частного?
источник
Какая польза от деструктора как частного?
По сути, всякий раз, когда вы хотите, чтобы какой-то другой класс отвечал за жизненный цикл объектов вашего класса, или у вас есть причина предотвратить разрушение объекта, вы можете сделать деструктор частным.
Например, если вы выполняете какие-то действия по подсчету ссылок, вы можете поручить объекту (или менеджеру, который был «другом») отвечать за подсчет количества ссылок на себя и удалять его, когда число достигает нуля. Частный dtor будет препятствовать тому, чтобы кто-либо еще удалил его, когда на него все еще были ссылки.
В другом случае, если у вас есть объект, у которого есть менеджер (или он сам), который может уничтожить его или может отказаться от его уничтожения в зависимости от других условий в программе, таких как открытое соединение с базой данных или запись файла. В классе или у менеджера может быть метод request_delete, который проверит это условие, удалит или отклонит его и вернет состояние, сообщающее, что он сделал. Это гораздо более гибко, чем просто вызывать «удалить».
Такой объект никогда не может быть создан в стеке. Всегда в куче. И удаление должно быть сделано через друга или члена. Продукт может использовать единственную иерархию объектов и пользовательский менеджер памяти - в таких сценариях может использоваться частный dtor.
#include <iostream>
class a {
~a() {}
friend void delete_a(a* p);
};
void delete_a(a* p) {
delete p;
}
int main()
{
a *p = new a;
delete_a(p);
return 0;
}
Когда вы не хотите, чтобы пользователи обращались к деструктору, т.е. вы хотите, чтобы объект был уничтожен только другими способами.
http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx приводит пример, в котором объект имеет счетную ссылку и должен уничтожаться только самим объектом, когда счетчик становится равным нулю.
источник
COM использует эту стратегию для удаления экземпляра. COM делает деструктор приватным и предоставляет интерфейс для удаления экземпляра.
Вот пример того, как будет выглядеть метод Release.
COM-объекты ATL являются ярким примером этого шаблона.
источник
Добавление к ответам, уже присутствующим здесь; частные конструкторы и деструкторы весьма полезны при реализации фабрики, где созданные объекты должны быть размещены в куче. Объекты, как правило, создаются / удаляются статическим членом или другом. Пример типичного использования:
источник
Класс может быть удален только сам по себе. Полезно, если вы создаете некоторый объект подсчета ссылок. Тогда только метод release может удалить объект, что поможет вам избежать ошибок.
источник
Я знаю, что вы спрашивали о частном деструкторе. Вот как я использую защищенные. Идея в том, что вы не хотите удалять основной класс через указатель на класс, который добавляет дополнительные функции к основному.
В приведенном ниже примере я не хочу, чтобы GuiWindow удалялось через указатель HandlerHolder.
источник
Диркгентно это неправильно. Вот пример объекта с частным c-tor и d-tor, созданным в стеке (здесь я использую статическую функцию-член, но это также можно сделать с помощью функции Friend или класса Friend).
Этот код будет выводить: внутри PrivateCD :: TryMe, p._i = 8
источник
Это может быть способ решения проблемы в Windows, где каждый модуль может использовать разные кучи, например, кучи отладки . Если эта проблема не решена правильно, могут случиться плохие вещи .
источник