首先,我们必须知道,虚析构函数是有其本身的目的,所以正常情况下,我们不应该声明虚析构函数。
构造函数和析构函数是一个互逆过程,但是他们并不是成轴对称的过程,而是类似中心对称的过程,你可以想象成输入和输出的关系。
对象被创建时,从父类的构造函数开始一直到子类的构造函数为止,他的发起点是子类的构造函数(发起点很重要,如果不理解这个,就能很好理解虚析构函数的作用)
对象被释放是,从子类的析构函数开始一直到父类的析构函数为止,他的发起点是子类的析构函数。
如果对象的析构函数没有定义成虚的,他的执行过程和上述的一致,但是,如果定义成虚的,那么他的发起点是这个对象实际的子类析构函数,这个不好描述,我们给两个例子。
没有定义虚析构函数的源码 输出从上图可知,我们定义的类B的析构函数并没有执行,这就有可能造成内存泄漏。再看一个例子:
定义了虚析构函数 输出从例子可以看出,当我们定义了虚析构函数,那么类B的析构函数也会被执行。
从上面的对比测试可知,虚析构函数可以让对象实现完全的释放,但是,如果没有必要定义虚析构函数,我们最好不要定义虚析构函数,因为功能的提升,会带来额外的开销,这是显而易见的道理!
网友评论