Я думал, почему только базовый класс с виртуальным методом нуждается в виртуальном дескрипторе? взгляд на этот кусок кода (читай комментарий):Почему базовый класс без виртуальных методов нужен виртуальный деструктор?
class Base{
private:
int x;
public:
Base():x(0){}
~Base(){
cout<<"Base dtor"<<endl;
}
};
class Derived : public Base{
int y;
public:
Derived():y(0){}
~Derived(){
cout<<"Derived dtor"<<endl;
}
};
int main(){
Derived *pd = new Derived;
Base *pb = pd;
delete pb; // this destroys only the base part, doesn't it?
// so why doesnt the derived part leak?
return 0;
}
Я побежал с Valgrind и увидел, что выход был «Base dtor», и не произошло никаких утечек памяти. Итак, если был вызван только базовый класс dtor, почему не происходит утечка производного класса?
Поскольку ни класс участвует в распределении ресурсов, так что нет никакой возможности утечки. (Тем не менее, то, что вы делаете, вызывает * неопределенное поведение *.) –
Потому что, если у вас нет виртуальных методов, нет причин использовать такой класс. ('Base * pb = pd;') Итак, здесь, поскольку вы используете класс как полиморфный класс, вам нужен виртуальный деструктор! – Csq
Попробуйте еще раз, но вместо вашего класса 'Derived', имеющего' int y', присвойте ему 'int * y' и сделайте производный конструктор присвойте' y = new int ...' и посмотрим, будет ли тогда valgrind! – druckermanly