当前位置: 首页 > 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. 对称二叉树
  • 0基础学习移动端适配
  • android 一些 utils
  • C++入门教程(10):for 语句
  • Docker下部署自己的LNMP工作环境
  • Javascript基础之Array数组API
  • JS数组方法汇总
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Octave 入门
  • python学习笔记 - ThreadLocal
  • Spring声明式事务管理之一:五大属性分析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue.js 移动端适配之 vw 解决方案
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 对JS继承的一点思考
  • 聊聊redis的数据结构的应用
  • 写给高年级小学生看的《Bash 指南》
  • 智能合约开发环境搭建及Hello World合约
  • 《天龙八部3D》Unity技术方案揭秘
  • 7行Python代码的人脸识别
  • k8s使用glusterfs实现动态持久化存储
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #pragam once 和 #ifndef 预编译头
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (1)Android开发优化---------UI优化
  • (k8s中)docker netty OOM问题记录
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)nsfocus-绿盟科技笔试题目
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net 4.0发布后不能正常显示图片问题
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net程序集学习心得