2016-04-01 2 views
0

Я прочитал несколько других подобных вопросов по этому вопросу, но я все еще запутался в использовании удаления для динамически распределенной памяти и виртуальных деструкторов. Если у меня есть объект класса 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(); 
}; 
+0

Недостаточно использовать виртуальный деструктор, если у вас нет виртуальных методов или если деструктор 'Base' не является' virtual' –

+0

Это не близко к компиляции. 'Base * p = new Derived;' никогда не будет работать. –

+0

Это предполагает, что деструктор базового базового класса является виртуальным и существуют различные виртуальные методы. Должно было уточнить. – LBaelish

ответ

2

Или использование виртуального деструктора без двух удалений позаботиться об этом уже?

Наличие виртуального деструктора не позаботится об удалении leftPtr и righPtr. Виртуальный деструктор гарантирует, что деструктор, соответствующий самому производному объекту, вызывается даже при использовании delete в указателе базового класса.

Вы не показали, что Base имеет виртуальный деструктор. Предполагая, что он делает,

Derived* ptr1 = new Derived; 
delete ptr1; // Calls ~Derived() 

Base* ptr2 = new Derived; 
delete ptr2; // Also calls ~Derived() 

Однако, если вы оставили из

delete leftPtr; 
delete rightPtr; 

из Derived::~Derived(), ваш код будет утечка памяти.

+0

Я думаю, что он может столкнуться с риском двойного удаления с помощью delete leftPtr и удалить rightPtr. Умные указатели будут лучшим вариантом. – MIbrah

+0

Хорошо, я понимаю, о чем вы говорите. Допустим, я не хотел удалять все слева и справа. Скажем, у меня есть многосвязная структура, и все, что слева, и rightPtr также указывает другие объекты. В этом случае я бы опустил два утверждения delete правильно? И никакого вреда? – LBaelish

+0

@LBaelish, вы должны найти способ удалить все, что выделяется из кучи. Если несколько объектов могут указывать на объект, лучше использовать 'std :: shared_ptr'. В противном случае вам понадобится много кода для управления указателями, которые 'std :: shared_ptr' уже делает. –

 Смежные вопросы

  • Нет связанных вопросов^_^