构造函数、析构函数、赋值函数的几个注意点

 

析构函数:

1、如果某个类打算作为其他类的父类,那么这个类的析构函数应当声明为虚函数。

按照C++的机制,当一个子类析构时,会从子类的析构函数开始,层层向上,直到把父类、祖父类···的析构函数都调用一遍,如果作为父类的类,它的析构函数不是虚函数的话,看例子:

Base* base=new Child();

delete base;

这里的delete base就只能从Base类的析构函数开始层层向上析构,而base指向的是一个Child类,Chiild类new出的内存将无法被释放,内存泄漏。解决办法就是把父类的析构声明为虚函数,这样使用父类指针指向子类对象时,调用delete base时,会调用到子类的析构函数,从子类的析构函数开始层层向上,就能把内存释放干净了。

而如果base的析构函数是个虚函数的话,在new child()时,base的虚析构函数指针位置会被child的析构函数指针给替换掉,这种情况下,析构base本质上就会调到child的析构函数,就不会出现问题,

从C++编译器的角度来讲,在编译到delete ptr;语句的时候,会自动把ptr类型以及其父类型的析构函数都倒序列出来执行。
因此,指针是什么类型的,就会从什么类型开始析构,直到析构到祖宗。

C++语言为什么在当初设计时,不规定一下,让delete编译时自动从最底层的子类开始析构?想法是很好的,但是却是不合逻辑的,编译期间,编译器根本不知道你这个指针是从哪个子类转过来的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值