博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FUCKED-BUG之临时对象的生死
阅读量:7236 次
发布时间:2019-06-29

本文共 565 字,大约阅读时间需要 1 分钟。

Bug出现的情形大概是这样的:

Value waitcall() {    Value iscall, v;    if (!fromMsgPack(cin, iscall))        return Value::Nil;    if (iscall)        handle();}int main() {    waitcall();         // 执行了这句之后就出现内存访问错误了}

看出不妥之处了吗?

我想了好久才想到。。。

在main函数里调用waitcall时,编译器会在栈上临时分配一段空间(Temp)用来存放waitcall的返回值,这段空间会通过Value的拷贝构造函数构造;在waitcall()函数里,最后没有指定一个返回值,导致waitcall返回的Value内的数据是不确定的,因为Temp时临时存放waitcall的返回结果的,所以当调用完waitcall时,它的生命周期也就结束了,然后会被析构,但是在这里我们没有正确构造Temp,所以结果可想而知

其实我写这个函数的本意是不需要返回值的,不知道当时哪根筋不对写了这么个有残疾的函数......,把函数返回类型改为void就好了

转载于:https://www.cnblogs.com/luzhlon/p/7087056.html

你可能感兴趣的文章
Android 8.1平台SystemUI虚拟导航键加载流程解析
查看>>
ViewPager2结合TabLayout
查看>>
java 异常
查看>>
动手实现一致性哈希算法,并搭建环境测试其负载均衡特性.
查看>>
2019年iOS开发者中心证书生成方法以及极光推送证书使用方法!
查看>>
React笔记 (四)
查看>>
高德地图之地图的属性
查看>>
hexo+github从0到1搭建免费个人博客
查看>>
理解 CSS line-height 与 vertical-align
查看>>
IntelliJ IDEA创建第一个Spring boot项目
查看>>
Android——弧形弯曲显示的ImageView
查看>>
玩转Go语言之捕获异常
查看>>
12项提高自我意识的练习并附有美好解决方案
查看>>
女人脸上突然很多斑点?教你怎么样去除脸上的斑点
查看>>
前端js:超级基础 ++x 和 x++
查看>>
《概念数学》第一章:伽利略与物体的乘法
查看>>
axios请求数据
查看>>
mysql5 7配置不生效解决记录
查看>>
不需要远程kernel就能在浏览器上运行 为数据科学实验和沟通打造的工具
查看>>
iOS - XML解析
查看>>