当前位置: 首页 > 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 错误处理方式
  • 2017-09-12 前端日报
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android开源项目规范总结
  • Angular数据绑定机制
  • express.js的介绍及使用
  • Fastjson的基本使用方法大全
  • Hibernate最全面试题
  • JavaScript DOM 10 - 滚动
  • LeetCode29.两数相除 JavaScript
  • node学习系列之简单文件上传
  • PAT A1017 优先队列
  • PHP 的 SAPI 是个什么东西
  • SQLServer插入数据
  • 编写高质量JavaScript代码之并发
  • 大主子表关联的性能优化方法
  • 利用jquery编写加法运算验证码
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 软件开发学习的5大技巧,你知道吗?
  • 协程
  • 一道面试题引发的“血案”
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (k8s中)docker netty OOM问题记录
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (笔试题)合法字符串
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)母版页和相对路径
  • .net 微服务 服务保护 自动重试 Polly
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @RequestBody与@ResponseBody的使用
  • [2023-年度总结]凡是过往,皆为序章
  • [android学习笔记]学习jni编程
  • [Angular 基础] - 数据绑定(databinding)
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [codevs 1296] 营业额统计