Сложно ли компилятор генерировать деструкторы?
Речь не идет о том, что легко или сложно сделать компилятору. Речь идет о фундаментального принципа программирования C++:
Вы не должны платить за то, что вам не нужно.
Эта философия преобладает во всех аспектах дизайна языка, включая определение и работу деструкторов.
Каждый класс нуждается в деструкторе. Вот почему компилятор автоматически пишет один для вас, если вы не делаете этого самостоятельно. Этот неявный деструктор уничтожает все члены и базовые классы в определенном порядке и определенным образом. Иногда это не то, что вы действительно хотите, но этот компилятор не может этого принять. Классический случай - это классы интеллектуальных указателей. Класс интеллектуального указателя будет иметь необработанный указатель на контролируемый объект где-нибудь, но компилятор не знает, должен ли этот указатель быть delete
d - возможно, вы используете интеллектуальный указатель-счетчик-счетчик. Если вам нужен деструктор, на самом деле указатель, который вы должны написать себе.
Другой случай - с delete
производными классами. Рассмотрим:
Base* p = new Derived;
delete p;
Если Derived
имеет кучу вещей в нем, который должен быть освобожден, то вам необходимо убедиться, что, когда вы delete
Derived
объект через Base
указатель, деструктор Derived
«s является тот, который на самом деле называется - даже несмотря на то, что компилятор не имеет возможности узнать на сайте вызова, что p
фактически указывает на Derived
. Чтобы выполнить эту работу, вам необходимо создать Base::~Base
a virtual
деструктор.
Если вы хотите управлять ресурсом, это зависит от вас. Большую часть времени вам не нужно, если вы используете надлежащие возможности C++, и деструктора по умолчанию достаточно. Но представьте, что вы завернули функцию C 'fopen()' в классе C++ и должны быть закрыты в destructore. Как мог компилятор C++ знать, что он должен вызывать 'fclose()' в деструкторе? – nos
слишком большая нагрузка? Похоже, вы должны использовать RAII! – Salgar
Возможно, довольно много деструкторов создаются автоматически. Не могли бы вы рассказать о том, о чем вы спрашиваете? Может быть, вы можете добавить пример кода, который, по вашему мнению, может быть автоматически упрощен автоматически генерируемыми деструкторами? –