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函数内。
偶然的你
TA贡献1841条经验 获得超3个赞
temp在conststring&version3(string&s1,conststring&s2)中是在栈上所以返回他的引用是有问题的因为temp在方法执行完后就已经被释放掉了.
添加回答
举报
0/150
提交
取消
