合成析构函数与虚析构函数

  • 合成析构函数:

 
 
  • 合成析构函数与复制构造函数和赋值操作符函数不同,就算你自己定义了析构函数,系统始终会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的成员,合成析构函数调用该成员的析构函数来撤销对象。注意:撤销内置类型成员或复合类型的成员没什么影响。尤其是,合成析构函数并不删除指针成员所指向的对象。所以,合成构造函数可以这样理解:
  • 1、合成析构函数在定义了派生类之后就会自动创建;
  • 2、它的作用是负责撤销你的派生类或者创建的一般类的初static成员以外的非指针成员,撤销顺序是声明次序的逆序;
  • 3、如果这个类中的成员是一个类类型,那么合成析构函数会调用这个类类型成员的析构函数来撤销这个成员对象;
  • 4、合成析构函数不会删除类中创建的指向一个对象的指针,所以我们常在自己定义的析构函数中delete一个new指针。

  • 虚析构函数:

 
 
  • C++中指出:如果删除基类指针,则需要运行基类析构函数并清除基类的成员,如果对象实际是派生类型的,则没有定义该行为。
  • 这句话的意思是,要删除一个基类类型的指针,调用基类析构函数就可以清除这个成员,但是如果这个指针所指的对象实际上是一个派生类型的话,那么这个行为是没有定义的,也就是说无法实现清除。如A* d = new B();(假定A为基类,B是从A继承而来的派生类),那么如果A的析构函数不是虚析构函数,那么在delete d时,B类的析构函数将不会被调用,就会产生内存泄漏和异常。
  • 这一切产生的原因是,以基类A定义的指针,销毁的时候销毁指针d,调用的A类的析构函数,基类A没有定义虚析构函数,那么在调用基类析构函数的时候就不会出现B类的虚函数表被拷贝到A的虚函数表,这样B类的析构函数就无法被调用。所以new出的B对象无法被删除。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值