pure virtual method called 纯虚函数被调用原理分析

本文分析了'pure virtual method called'错误的原理,涉及虚函数表、纯虚函数、抽象基类(ABC)以及继承关系中父类和子类的初始化与析构顺序。在析构过程并发调用对象的虚函数会导致调用纯虚函数,引发程序异常。通过一个简单的示例代码展示了如何复现这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序退出或者组件析构过程中常发生一类“pure virtual method called”导致的core,前几栈帧如下:

这里对该问题发生的原理做一个剖析并给出一个可复现该问题的简单demo

前置知识

一、虚函数表

虚函数表的概念在很多如《c++ primer plus》等权威书籍中有详细阐述,这里简单回顾下虚函数表的概念

虚函数表用于支持运行时多态,在继承关系中,父类声明的函数在子类的中可以用同名函数重写,这类函数按照静态调用的规则,根据指针、引用、原始对象的类型决定调用父类函数还是子类函数。若父类函数用virtual声明,那么这个函数在其继承链的所有子类、孙子类等中均为虚函数,具备运行时多态度,在使用指针、引用调用时,根据实际对象的类型决定调用父类函数还是子类函数。为了实现这种运行时多态,编译器采用的方法大多是使用虚函数表。父类和子类各自保存各自的一个虚函数表,虚函数表中保存若干函数指针,指向所有虚函数在本类中的实现,从而定位到某个虚函数。

二、纯虚函数和ABC(abstract basic class)类

若父类虚函数用=0标记,如 virtual void func() = 0; 那么这种父类被称为“ABC类”,不能为该类实例化对象。c++标准允许父类不为这种函数提供定义,若没有提供定义,那么编译器会将这类函数的地址指向__cxa_pure_virtual,也就是图中第5帧,在该函数中终止程序,这就是发生调用纯虚函数后程序发生段错误并产出core的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值