虚析构函数的要求

 1 void main()
 2 {
 3     TPerson* p;
 4     TStudent* sp;
 5     //创建一个TPerson类对象并将其他地址储存在p指针中
 6     p = new TPerson(/*省略此处*/);
 7     //释放p所指对象
 8     delete p;
 9     sp = new TStudent(/*省略此处*/);
10     
11     p = sp;
12     delete p;
13 }

p=sp;

让p指向了sp中的TPerson部分;

当delete p时,只释放了TPerson的部分,但没有释放TStudent的动态分配的部分,并且TStudent类已经无法使用,所以导致严重的内存泄露。

所以我们将在TPerson类的析构函数中加上virtual关键字。

1 class TPerson
2 {
3 public:
4     //其他细节省略
5     virtual ~TPerson();
6     
7 };

改动后,通过p调用delete时,编译器将调用TStudent类的析构函数(因为动态绑定)。TStudent类的析构函数将自动调用TPerson类的析构

函数,这些都由编译器来完成,无需程序员操心。

只有用基类指针动态使用对象的情况下,已经删除指向派生类对象的基类指针时,才会导致内存泄露;

一些注意事项:

当使用基类时,要看该基类的析构函数是否声明为virtual;

原文地址:https://www.cnblogs.com/zhengzhe/p/6600432.html