先贴出一个小例子
#include <stdio.h>
#include <string>
class Packet {
public:
Packet() {printf("Packet construtor\n");}
virtual ~Packet() {printf("Packet destrutor\n");}
};
class Wrapper : public Packet {
public:
Wrapper() {printf("Wrapper construtor\n");}
~Wrapper() {printf("Wrapper destrutor\n");}
};
int main() {
Packet *packet = new Wrapper();
delete packet;
return 0;
}
当父类Packet的析构函数没有加上virtual的时候,
Packet construtor
Wrapper construtor
Packet destrutor
当父类Packet的析构函数加上virtual的时候,
Packet construtor
Wrapper construtor
Wrapper destrutor
Packet destrutor
可以明显看到,父类的析构函数没有加virtual时,当以多态的形式运行时,如果没有virtual,通过父类的指针去调析构函数时,子类的析构函数将不会被调用,而是直接调用父类的析构函数,如果此时子类存在某些占用内存的变量,那将不会被释放,造成内存泄漏