为了账号安全,请及时绑定邮箱和手机立即绑定

C++的引用问题

C++的引用问题

www说 2019-04-21 20:37:28
includeincludeusingnamespacestd;stringversion1(conststring&s1,conststring&s2);conststring&version2(string&s1,conststring&s2);conststring&version3(string&s1,conststring&s2);intmain(){stringinput;stringcopy;stringresult;cout
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

首先我们要知道C++引用是什么东西,其实它就是指针,只不过编译器给加了点语法糖和类型检查。
语法糖让你不用写*和->
类型检查导致引用只能在定义的时候绑定一次
所以函数version3等价于
conststring*version3(string*s1,conststring*s2)
{
stringtemp;
temp=*s2+*s1+*s2;
return&temp;
}
函数version3中的temp是局部变量,所以函数退出时会调用string析构函数,temp对象占用的内存全部被释放。version3返回了一个指针,但是指针指向的对象已经析构了,这就是野指针啊。
访问野指针指向的内存,轻则coredump,重则产生哭爹的逻辑错误。那代码中哪一行会访问野指针指向的内存呢,就在下面这行代码中:
result=version3(input,"@@@")
这里会调用string的copyassignment,必然牵涉到拷贝,于是要访问已经被释放的内存。
所以致命的一步就发生在string的copyassignment函数内。
                            
查看完整回答
反对 回复 2019-04-21
?
偶然的你

TA贡献1841条经验 获得超3个赞

temp在conststring&version3(string&s1,conststring&s2)中是在栈上所以返回他的引用是有问题的因为temp在方法执行完后就已经被释放掉了.
                            
查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 315 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号