当前位置: 首页 > 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 错误处理方式
  • 【Leetcode】101. 对称二叉树
  • 【React系列】如何构建React应用程序
  • 【剑指offer】让抽象问题具体化
  • Java 23种设计模式 之单例模式 7种实现方式
  • Meteor的表单提交:Form
  • vue的全局变量和全局拦截请求器
  • vue数据传递--我有特殊的实现技巧
  • 规范化安全开发 KOA 手脚架
  • 后端_MYSQL
  • 基于web的全景—— Pannellum小试
  • 离散点最小(凸)包围边界查找
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端设计模式
  • 微信小程序填坑清单
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 写代码的正确姿势
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 选择阿里云数据库HBase版十大理由
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ${factoryList }后面有空格不影响
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)Nginx简介和安装教程
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (八)c52学习之旅-中断实验
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (一)appium-desktop定位元素原理
  • (转)C#调用WebService 基础
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET实现之(自动更新)
  • .NET正则基础之——正则委托
  • @GetMapping和@RequestMapping的区别
  • @Resource和@Autowired的区别
  • [ C++ ] 继承
  • [CTF]php is_numeric绕过
  • [HTML]HTML5实现可编辑表格
  • [I2C]I2C通信协议详解(一) --- 什么是I2C