调用析构函数可能会出现的问题
先看下面一段代码
#include<iostream>
using namespace std;
class something
{
public:
something(){cout<<"2";}
~something(){cout<<"2";}
};
class parent
{
public:
parent(){cout<<"1";}
~parent(){cout<<"1";}
};
class child:public parent
{
public:
child(){cout<<"3";}
~child(){cout<<"3";}
protected:
something mdatamember;
};
int main()
{
child mychild;
return 0;
}
上面这段代码的执行结果是123321,先调用对应的构造函数再调用析构函数
问题就在这里产生了,如果我定义一个基类指针,使它指向子类申请的空间,并释放这段内存,看看结果会是什么样?
#include<iostream>
using namespace std;
class something
{
public:
something(){cout<<"2";}
~something(){cout<<"2";}
};
class parent
{
public:
parent(){cout<<"1";}
~parent(){cout<<"1";}
};
class child:public parent
{
public:
child(){cout<<"3";}
~child(){cout<<"3";}
protected:
something mdatamember;
};
int main()
{
parent*mychild=new child;
delete mychild;
return 0;
}
理想中的结果是123321,也就是调用了哪些类的构造函数,该类对应的析构函数也应该被调用,可是上面这段代码的执行结果是1231。没有调用类something、类child的析构函数。
这样就不能完全把释放完毕空间。这是因为parent类指针只能调用其本身类中的析构函数。
为了能完全把空间释放完毕,可以用虚函数实现,也就是在每个析构函数前面加上一个virtual即可!
代码如下
#include<iostream>
using namespace std;
class something
{
public:
something(){cout<<"2";}
virtual ~something(){cout<<"2";}
};
class parent
{
public:
parent(){cout<<"1";}
virtual ~parent(){cout<<"1";}
};
class child:public parent
{
public:
child(){cout<<"3";}
virtual ~child(){cout<<"3";}
protected:
something mdatamember;
};
int main()
{
parent*mychild=new child;
delete mychild;
return 0;
}
上面代码的执行结果是123321,完全释放了空间!
写了上面的三个代码目的只有一个,告诉大家在继承的过程中如果想释放干净空间,需要把要调用的析构函数用虚析构函数代替!
拓展:
程序在执行的过程中,虚函数是如何动态实现调用对应类的函数的!牵涉到虚函数表,感兴趣的的话可以在网上搜搜
本文通过实例演示了在C++中使用虚析构函数来确保派生类对象被正确删除的过程。介绍了当基类指针指向派生类对象时,如果不使用虚析构函数将导致资源泄露的问题。

被折叠的 条评论
为什么被折叠?



