当前位置: 首页 > news >正文

[boost]使用boost::function和boost::bind产生的down机一例

服务器代码依赖了boost的function和bind,用来做回调,异步调用时会出现这种down机.闲话少说上代码:

void fn(std::string str);

char *temp_str = new char[24];
strcpy(temp_str,"1212");
boost::function f
= boost::bind(fn,temp_str); f();

这边的f函数对象里面保存了一个temp_str的指针,如果是同步调用,会有临时的std::string变量产生,产生拷贝一次temp_str,之后就不在引用temp_str,所以不会出现任何问题;

可是如果是异步调用,temp_str就可能是野指针,如果temp_str被释放了,从const char*构造一个std::string的过程就有可能会down掉.这也就是我们服务器里面一个(一批,准确的说)存在了两年多的Bug.

 

虽然知道了Bug的原因,解决办法也会很容易有,就是自己显式的产生一个临时变量,让boost拷贝过去.......

std::string temp_string = temp_str;
boost::function f = boost::bind(fn, temp_string);

 

但是,我在想,为啥boost当初设计的时候,这么蛋疼,为啥不直接保存一个函数参数签名类型的变量,而是保存了一个bind后面的变量.毕竟bind的时候,已经推导出来函数各个参数的准确类型了.如果他直接保存一个签名类型的变量,就不会发生这种问题.

 

PS:

boost::bind,boost::function,boost lambda在设计的时候,都是lazy的,就是惰性求值.包括C++11的lambda表达式,也有可能是惰性求值.
在使用的时候需要注意.

转载于:https://www.cnblogs.com/egmkang/archive/2012/04/15/2446713.html

相关文章:

  • HLG 1360 Leyni的国家III【并查集】
  • 钗头凤
  • CSS 教程Part7 [打印、单位表](摘录自 W3C School)
  • mysql表错误记录
  • 有了网络,学习也方便了不少
  • 解决 vSphere Web Access 503 错误
  • C++关键词
  • ubuntu depeen 一些技巧
  • 【转载】[Windows Forms] : BindingSource使用模式 - Data Binding基础知识 (二)
  • groovy string类型转换成int(来自csdn)不要问为什么系列6
  • svnserve:error while loading shared libraries:/usr/local/lib/libsvn_fs-1.so.0:cannot restore
  • 经常查看的一些命中率
  • 删除Exchange 2010 中的已断开连接邮箱
  • 软件开发30岁,中层管理40岁?
  • Oracle数据库 ORA-28000 错误处理方式
  • JS 中的深拷贝与浅拷贝
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Angular Elements 及其运作原理
  • ES6语法详解(一)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript 基础知识 - 入门篇(一)
  • k8s 面向应用开发者的基础命令
  • Node + FFmpeg 实现Canvas动画导出视频
  • vue-router的history模式发布配置
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 安装python包到指定虚拟环境
  • 编写高质量JavaScript代码之并发
  • 程序员该如何有效的找工作?
  • 浮动相关
  • 高度不固定时垂直居中
  • 将回调地狱按在地上摩擦的Promise
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端临床手札——文件上传
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微信小程序实战练习(仿五洲到家微信版)
  • nb
  • C# - 为值类型重定义相等性
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (实战篇)如何缓存数据
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .java 9 找不到符号_java找不到符号
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Redis的秒杀Dome和异步执行
  • .NET 服务 ServiceController
  • .NET 命令行参数包含应用程序路径吗?
  • .net访问oracle数据库性能问题
  • .NET精简框架的“无法找到资源程序集”异常释疑