考虑以下C ++代码。
struct foo { std::string value; }
inline foo bar() { return { "42" }; }
现在假设我有一个以下列方式使用bar()的函数。
std::string my_func()
{
const auto &x = bar();
return x.value;
}
这是否泄漏内存因为my_func只保存对x的引用?或者,在my_func终止后,x仍然会被清除吗?
我知道这不是应该如何使用引用。但我刚刚意识到这个编译很好,并想知道它的语义是什么。
答案 0 :(得分:6)
但我刚刚意识到这个编译很好
提供的代码不应该编译,因为尝试将临时值分配给左值引用。
错误:从'foo'类型的右值开始无效初始化'foo&'类型的非const引用
如果你通过
修改代码std::string my_func()
{
const auto &x = bar();
return x.value;
}
然后就可以了,因为const引用会延长const引用的生命周期。
答案 1 :(得分:3)
简答:不。
更长的答案:在这种情况下,编译器将确保引用的临时对象将存活到当前范围的末尾。 bar()
按值返回n个对象。这将被复制到一个临时的匿名对象中,然后引用将引用该临时对象。
还有其他类似的情况,其中标准有明确的要求:绑定到引用的临时值直到达到当前范围的结束为止。
答案 2 :(得分:1)
不,该字符串被复制到返回值中。 x引用的对象在函数之后超出范围。
答案 3 :(得分:1)
这不是泄漏,您的引用只是指向由于临时而被堆栈展开清理的内存。对象
访问x将导致未定义的行为。可能违反访问权限。