关于C++中虚析构函数的一些问题
对于虚析构函数的问题,在《C++面向对象程序设计》教材书上只是简单的提了一下,也就是P176页中。
我们知道虚析构函数的出现和多态性有一定的关系,即为了实现功能的晚绑定,能在基类派生的子类中可以充分释放基类中的成员,但是在使用多态性时,导致子类中的构析函数无法被调用
A a = new B();
delete a;
以上代码中只能使用A类中的构析函数,对于B类中新增的成员却无法实现释放。这个时候就需要将基类中的构析函数定义为虚析构函数(virtual标识)
class A {
virtual ~A(){ cout<<"A::~A"<<endl;}
}
class B public A {
~B(){ cout<<"B::~B"<<endl;}
}
········
int main(){
·······
A a = new B();
delete a;
}
在此段代码的中输出结果为:
B::~B
A::~A
从结果可以知道,系统会首先调用派生类的析构函数,再调用基类的析构函数,这样两个对象中的成员均可以得到相应析构函数释放
舒畅的感觉,再也不便秘了
但是问题来了,对于单个对象多态性这样释放是没有问题,放到一个基类的数组指针也可以行得通吗?
····
A *a[2] = {NULL};
a[0] = new B();
a[1] = new B();
// delete[] a; //错误!
for(int i = 0;i < 2;i++){
delete a[i];
a[i] = NULL;
} //释放成功!
····
在定义对象数组指针时有点可以注意的时必须让指针指向NULL,同时因为是数组,需要使用“{ }”
对于使用第一种错误释放方法就是上图错误啦,至于问题所在以后再去了解了,问题大致是内存空间问题吧,无法有序的释放一个数组指针,必须要是使用一个循环来释放,最好释放后吧指针指向NULL以免产生其他问题,养成好习惯。
最后小声逼一句,C++没有垃圾回收机制,导致开发时各种关于内存的报错,Java有GC垃圾回收机制,导致程序运行臃肿,但是对于新手入门友好,C++更加规范开发者开发习惯