引用会导致内存泄漏吗?

时间:2015-11-05 21:25:27

标签: c++ c++11

考虑以下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仍然会被清除吗?

我知道这不是应该如何使用引用。但我刚刚意识到这个编译很好,并想知道它的语义是什么。

4 个答案:

答案 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将导致未定义的行为。可能违反访问权限。