delete基类指针释放子类对象

1、首先需要了解父类和子类的内存分布

如下图,B类(子)继承A类(父):
在这里插入图片描述
2、其次就是delete删除对象原理

delete就是依据指针指向的内存地址,如何删除内存数据,具体删除多少呢?那就看指针类型了。
如果指针类型为A*,那就删除A类大小的内存。

3、按1、和2中的内容,那么冒出一个问题!

看如下代码:

A* a = new B();			//按上图方式,B继承于A

delete a;

父类指针指向子类对象的情况会怎么删除?
依据上面内容推测,B类中的A对象段的内存将会被删除,而剩余的B自己的数据将不会,这样不是造成内存泄漏了!!!貌似好像是这样。

4、针对这个问题有什么解决方法?

将父类析构函数设置为虚函数,也就是函数前面加“virtual”即可解决此问题。
这样的情况下,delete a会先执行子类的析构函数后,再执行父类的析构函数。

(1) 父类析构函数不虚化,运行情况如下:

A();
B();
~A();

(2) 父类析构函数设为虚函数,运行情况如下:

A();
B();
~B();	//!!! 不同点 !!!
~A();

Guess you like

Origin blog.csdn.net/weixin_42887343/article/details/120111760