关于 pure virtual method called terminate called without an active exception 解决方案
文章目录
- 一、问题描述
- 二、解决思路
- 三、解决方案
一、问题描述
因为最近在学习 C++ 并实践导师给的项目,在实践的过程中基本每天都会踩坑,今晚遇到了一个困扰了我好几个小时的问题。具体问题是当程序运行时总会报 pure virtual method called terminate called without an active exception 这个错误。
对于这个问题我在网上查询了很多资料都没有太好的解决方案,对于我的业务代码基本是这样的:
void func()
{while(true){connfd = accept();CWork work;work.setConnfd(connfd);m_thread_pool.addWork(work);}
}void f()
{work.run();
}
主要的代码逻辑就是前端接收 TCP 请求,将其封装为 CWork 后交给线程池来进行处理(具体是将其添加到任务队列中,然后又业务线程从任务队列中不断获取任务执行)。
二、解决思路
首先在网上经过查询后我发现这个错误的主要原因是当前对象已经被销毁或者正在被销毁,导致最终调用到其基类的 虚方法 上,最终报出了这个错误。为了验证这个思路我首先在该对象(work)的析构函数中进行了打印,在运行时果然发现在执行到 work 对象的 run 方法之前该对象就已经被销毁了。
后来我又做了很多尝试,最终才发现因为自己对于 C++ 语法不熟练,导致对于对象作用范围的判断出现了失误。在 C++ 中我们主要有三种创建对象的方法:
- Test test1; // 栈中分配 ,由操作系统进行内存的分配和管理
- Test test2 = Test; // 栈中分配 ,由操作系统进行内存的分配和管理
- Test *test3=new Test(); // 堆中分配 ,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏
而我上面的那种创建方式刚好就是第一种方式,也就是说当前对象在栈中进行分配的,且因为其作用于为 while 循环中,所以每一轮循环都会创建一个新的 work 对象,且前一个对象因为被保存在栈上,所以循环结束后就已经被销毁。因此,这时再在外部对其进行调用,肯定就会报错了。
三、解决方案
知道了问题出现的原因,对于问题的解决就比较简单了,因为我的项目是针对网络连接请求的,因此必须保证每一个连接都对应一个新的 work 对象,但是我们还需要保证它不会在本轮循环结束后就被销毁。因此,我们直接使用第三种创建对象的方式 Test *test3=new Test()
即可解决该问题。
关于 pure virtual method called terminate called without an active exception 解决方案相关推荐
- pure virtual method called terminate called without an active exception Abor
加上海思编译器的参数: g++ -mcpu=generic-armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4
- QT报错:“pure virtual method called; terminate called without an active exception“
QT报错:"pure virtual method called; terminate called without an active exception" 1. 错误出现 2. ...
- C++ 错误 pure virtual method called
C++ 错误 pure virtual method called 某日做UnitTest(单元测试)时,Gtest跑完析构时,报出如下错误 ..... ..... ..... [ PASSED ] ...
- Qt复现pure virtual method called报错,与解决办法
现象 程序崩溃,报错:pure virtual method called,terminate called without an active exception,大意为调用了纯虚函数,程序中止. ...
- CLion报错解决:allocating an object of abstract class type--unimplemented pure virtual method
在用CLion写代码时遇到了这个报错: allocating an object of abstract class type '...' unimplemented pure virtual met ...
- pure virtual method called 纯虚函数被调用原理分析
程序退出或者组件析构过程中常发生一类"pure virtual method called"导致的core,前几栈帧如下: 这里对该问题发生的原理做一个剖析并给出一个可复现该问题的 ...
- 运行错误 terminate called without an active exception
运行错误:terminate called without an active exception,可能的原因 :下面的代码中的 t41.join(); t42.join(); ...
- terminate called without an active exception错误分析
项目场景: 在使用C++中thread类创建子线程完成相关功能,并且主线程不阻塞直到子线程完成. 问题描述: 子线程的初始化在对象的初始化过程中,并且子线程有自己独立的功能,主线程并不阻塞直到子线程完 ...
- terminate called without an active exception异常
terminate called without an active exception异常 参考文章: (1)terminate called without an active exception ...
最新文章
- 基于Pytorch对YOLOV5 进行简易实现
- Android 启动模式简介
- Public Prize
- selinux关闭后mysql_centos下关闭selinux不重启的方法
- 裸眼3D全攻略3:拍摄3D—瞳距、镜距、视角偏转与空间感
- 《2018中国区块链行业分析报告》(50页PPT全文)
- 1.1 为什么是 ML 策略
- 用递归方法实现读取文件夹下所有文件信息
- GAMP|Visual Studio 2019环境下配置GAMP
- 边缘检测---Roberts算子
- ubuntu下安装anjuta
- python保存路径_Python模块的正确存放位置
- 关于git 提交报错rejected解决
- 旁注,跨库,CDN绕过之——旁注
- Largest prime factor
- Python等待所有线程任务完成
- 阿里企业邮箱设置过滤方法
- 最新Exsi-6.7.0U3b版本下载
- C 结构体 struct 详解
- 心脏出血漏洞(CVE-2014-0160)