回调函数中删除对象引发的隐晦非法访问崩溃问题
回调函数,这里说的是一种笼统的概念,泛指一个对象或者一个过程调用陷入另一个对象或过程。本文想要描述的就是在回调函数中执行释放、删除动作去销毁调用调用者相关联的内容,导致访问非法。
下面用一段代码来简述一下这个坑是怎么产生的:
class ISomeFace
{
public:void callback(CBase* pBase)=0;
}
class CCallee:public ISomeFace
{
public:void callback(CBase* pBase);{handleCBase(pBase);if(pBase == WORK_DONE){delete pBase;}}
}class CCaller: public CBase
{
public:virtual ~CCaller(){if(mBuffer)delete[] mBuffer;}void doSomething(ISomeFace* sf){if(mBuffer==NULL) mBuffer = new char[1024];sf->callback(this);doNextActionWith(mBuffer);}
private:char* mBuffer;
}
当调用doSomething的时候进入了sf->callback,在callback中因为达成了某些条件,代码决定删掉pBase,也就是CCaller。可以看到~CCaller中释放了mBuffer。这样当调用完毕回到doSomething的doNextActionWith,此时访问mBuffer就成为非法访问。
这种问题比较隐晦,有时候因为mBuffer刚被释放,立即访问不会马上产生异常,或者因为doNextActionWith做的比较严谨程序长时间都不会出现问题,但是保不齐哪天开始大规模出事!
另外实际项目中,这种销毁关系不会那么明显,可能经过多层调用后辗转间接执行了销毁,特别是仅在小概率条件发生时才销毁,这样就产生了小概率崩溃发生,非常难于调试。所以我建议的解决办法是马上去review所有在回调中执行的销毁动作,最好理清间接的销毁动作;如果是linux平台可以用valgrind的memcheck来协助你找到这样的问题。
回调函数中删除对象引发的隐晦非法访问崩溃问题相关推荐
- spring返回数据使用ajax,【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中...
问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...
- es6删除对象的属性_javascript - 按对象属性从数组中删除对象
javascript - 按对象属性从数组中删除对象 var listToDelete = ['abc', 'efg']; var arrayOfObjects = [{id:'abc',name:' ...
- 在JavaScript中删除对象
本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...
- 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端
我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...
- JavaScript 回调函数中的 return false 问题
今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...
- 回调函数中window.open()被拦截
在回调函数中window.open默认是会被拦截的,因为浏览器判断它不是用户自己打开的,存在安全风险,所以可以伪造一个用户点击事件来避开,代码如下: function newWindow(url, i ...
- python线程池回调函数_python回调函数中使用多线程的方法
下面的demo是根据需求写的简单测试脚本 #!/usr/bin/env python # coding: utf-8 # 第一个列表为依赖组件和版本号,后面紧跟负责人名称 # 接着出现第二个以来组建列 ...
- ROS开发系列(7)- 在回调函数中发布topic
文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...
- C++回调函数中调用Python函数出现的死锁问题调试及解决
一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...
最新文章
- python使用fpdf生成pdf文件:配置多种语言字体写入多种文字
- 20180521 数组转换
- CodeIgniter中Router类的两个方法
- Cube 技术解读 | 详解「支付宝」全新的卡片技术栈
- 创建第一个WCF程序
- 一文理类加载相关知识:类加载器、双亲委派、SPI
- 鸿蒙关键技术研究,华为鸿蒙 2.0 系统主题演讲公布,详细架构 9 月 11 日揭晓
- matlab编写文件格式,MATLAB程序设计教程(4)——MATLAB文件操作
- 解决springboot jar包冲突
- 大学计算机基础流媒体,大学计算机基础经典课件.ppt
- opencv 快速生成scv文件 java
- Linux基础学习记录
- 中央财经大学python期末考试答案_大学mooc2020用Python玩转数据题库及期末考试答案...
- db2 日期英式写法_英语日期格式
- Hi3531D加载TVP7002驱动模块——新手全过程记录
- 【论文】针对图片过大问题,在不降低图片dpi的情况下缩小图片大小
- 初创企业融资PPT模板
- 2021年起重机司机(限桥式起重机)免费试题及起重机司机(限桥式起重机)试题及解析
- 凤凰系统虚拟机装卡_虚拟机安装凤凰系统(PhoenixOS)教程
- Scarborough Fair
热门文章
- 骨癌棋童战和四大冠军 棋手微博记录圆梦时刻
- 服务器主板显示00无法开机,电脑主板不开机故障数码卡显示“00”该怎样维修...
- VS2015帮助查看器打不开的解决办法
- 一些地理相关期刊类别
- On Error Resume Next
- 泰勒公式的收敛域的程序验证
- 基于NodeJS的简易DDNS
- html手机录音为wav文件,【未解决】用WebAudioRecorder.js去实现录音并保存为wav格式...
- 长沙iPhone4S 广源通讯特价3800可分期
- 从京东退货体验吐槽客服流程