C++函数返回const string&引用时输出为空的问题咨询
问题根因
你的代码触发了悬空引用的未定义行为,打印出空字符串只是未定义行为的一种表现,本质是返回的引用已经指向了被销毁的无效内存:
s1 + s2是表达式运算生成的临时std::string对象,这个临时对象的生命周期仅持续到combine函数返回的瞬间- 你将这个临时对象绑定到返回值
const string&上,等函数执行完毕回到调用点时,临时字符串已经被系统销毁回收 - 此时你通过返回的引用访问内存,读到的是已经被释放的非法内存空间,出现空串、乱码、程序崩溃都是符合预期的随机结果,没有任何确定性。
修复方法
最合理的改法是直接按值返回拼接结果,不要返回引用:
std::string combine(std::string &s1, std::string &s2) { return s1 + s2; }
现代C++编译器会对这种返回场景自动做返回值优化(RVO),不会产生额外的字符串拷贝开销,性能和返回引用没有差异,是这类字符串拼接函数的标准写法。
注意:只要写返回引用的函数,必须严格保证被引用的对象在函数返回后、引用被使用的全周期内依然合法存活,永远不要返回函数内局部变量、临时表达式生成的临时对象的引用。
内容的提问来源于stack exchange,提问作者SomeoneNew
相关产品推荐
相关产品推荐

