回调函数,这里说的是一种笼统的概念,泛指一个对象或者一个过程调用陷入另一个对象或过程。本文想要描述的就是在回调函数中执行释放、删除动作去销毁调用调用者相关联的内容,导致访问非法。

下面用一段代码来简述一下这个坑是怎么产生的:

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来协助你找到这样的问题。

回调函数中删除对象引发的隐晦非法访问崩溃问题相关推荐

  1. spring返回数据使用ajax,【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中...

    问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  2. es6删除对象的属性_javascript - 按对象属性从数组中删除对象

    javascript - 按对象属性从数组中删除对象 var listToDelete = ['abc', 'efg']; var arrayOfObjects = [{id:'abc',name:' ...

  3. 在JavaScript中删除对象

    本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...

  4. 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端

    我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...

  5. JavaScript 回调函数中的 return false 问题

    今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...

  6. 回调函数中window.open()被拦截

    在回调函数中window.open默认是会被拦截的,因为浏览器判断它不是用户自己打开的,存在安全风险,所以可以伪造一个用户点击事件来避开,代码如下: function newWindow(url, i ...

  7. python线程池回调函数_python回调函数中使用多线程的方法

    下面的demo是根据需求写的简单测试脚本 #!/usr/bin/env python # coding: utf-8 # 第一个列表为依赖组件和版本号,后面紧跟负责人名称 # 接着出现第二个以来组建列 ...

  8. ROS开发系列(7)- 在回调函数中发布topic

    文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...

  9. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

最新文章

  1. python使用fpdf生成pdf文件:配置多种语言字体写入多种文字
  2. 20180521 数组转换
  3. CodeIgniter中Router类的两个方法
  4. Cube 技术解读 | 详解「支付宝」全新的卡片技术栈
  5. 创建第一个WCF程序
  6. 一文理类加载相关知识:类加载器、双亲委派、SPI
  7. 鸿蒙关键技术研究,华为鸿蒙 2.0 系统主题演讲公布,详细架构 9 月 11 日揭晓
  8. matlab编写文件格式,MATLAB程序设计教程(4)——MATLAB文件操作
  9. 解决springboot jar包冲突
  10. 大学计算机基础流媒体,大学计算机基础经典课件.ppt
  11. opencv 快速生成scv文件 java
  12. Linux基础学习记录
  13. 中央财经大学python期末考试答案_大学mooc2020用Python玩转数据题库及期末考试答案...
  14. db2 日期英式写法_英语日期格式
  15. Hi3531D加载TVP7002驱动模块——新手全过程记录
  16. 【论文】针对图片过大问题,在不降低图片dpi的情况下缩小图片大小
  17. 初创企业融资PPT模板
  18. 2021年起重机司机(限桥式起重机)免费试题及起重机司机(限桥式起重机)试题及解析
  19. 凤凰系统虚拟机装卡_虚拟机安装凤凰系统(PhoenixOS)教程
  20. Scarborough Fair

热门文章

  1. 骨癌棋童战和四大冠军 棋手微博记录圆梦时刻
  2. 服务器主板显示00无法开机,电脑主板不开机故障数码卡显示“00”该怎样维修...
  3. VS2015帮助查看器打不开的解决办法
  4. 一些地理相关期刊类别
  5. On Error Resume Next
  6. 泰勒公式的收敛域的程序验证
  7. 基于NodeJS的简易DDNS
  8. html手机录音为wav文件,【未解决】用WebAudioRecorder.js去实现录音并保存为wav格式...
  9. 长沙iPhone4S 广源通讯特价3800可分期
  10. 从京东退货体验吐槽客服流程