Я прочитал несколько других подобных вопросов по этому вопросу, но я все еще запутался в использовании удаления для динамически распределенной памяти и виртуальных деструкторов. Если у меня есть объект класса Base
или класса Derived
в связанной структуре, так что если я удалю узел, я также хочу удалить все узлы, которые могут назвать этот узел предком. Нужно ли указывать это в деструкторе, как показано ниже? Или же использование виртуального деструктора без двух delete
s позаботится об этом?Виртуальные деструкторы и удалить ключевое слово
class Base{ /*...*/ };
class Derived: public Base
{
public:
//various virtual functions//
virtual ~Derived()
{
delete leftPtr;
delete rightPtr;
}
private:
Base* leftPtr = new Derived();
Base* rightPtr = new Derived();
};
Недостаточно использовать виртуальный деструктор, если у вас нет виртуальных методов или если деструктор 'Base' не является' virtual' –
Это не близко к компиляции. 'Base * p = new Derived;' никогда не будет работать. –
Это предполагает, что деструктор базового базового класса является виртуальным и существуют различные виртуальные методы. Должно было уточнить. – LBaelish