有关析构函数的问题
- C/C++ code
#include <iostream>using namespace std;class A{public: virtual ~A(){cout<<"A"<<endl;}};class B : public A{public: ~B(){cout<<"B"<<endl;}};int main(){ A *a = new B; delete a;}
大家好,B继承A,B中就有A的数据
1、当B的析构函数执行时,析构B的对象,是不是意味B这个对象的所有数据(包括继承A的数据)都将清空
2、A *a不是对象,但delete a执行了~A,有什么意义吗
[解决办法]
B析构后,调用A的析构
delete a;执行的应该就是上面的步骤
[解决办法]
1、对象的数据是会清空,不过对象成员如果有外部的指针引用就不一定了,具体要看析构函数怎么定义的;
2、这里是因为A的析构函数被定义为虚函数造成的,这和C++的析构策略有关系,如果A的析构函数不是虚的,这种情况下B的析构函数调用的机会都没有,delete在这种情况下就按类型调用方法了,是早绑定。
[解决办法]
对象的销毁涉及到两个方面: 调用对象的析构函数,然后释放对象本身占用的内存空间.当删除继承类对象时,如楼主例子中的delte a;正如2楼所说,如果基类的析构函数不是虚拟的,则只会调用基类的析构函数,而不会调用继承类的析构函数。在此情况下,如果继承类动态分配了内存,则可能将没有释放机会(如果释放是在析构函数中完成的话),导致内存泄露发生。所以,如果涉及到内存分配,应将基类的析构函数定义为虚拟的。
[解决办法]
我的理解是A类的析构是虚析构函数,这样DELETE a的时候就可以调用B的析构函数了,而创建的是A类的指针,指向子类的对象,这一般是多态的用法。