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;