引用会导致内存泄漏吗

Can references cause memory leaks?

本文关键字:泄漏 内存 引用      更新时间:2023-10-16

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

我知道参考文献不应该这样使用。但我刚刚意识到它编译得很好,并想知道它的语义是什么。

但我刚刚意识到这编译了很好的

提供的代码不应编译,因为它试图将临时赋值给左值引用。

错误:"foo&"类型的非常量引用的初始化无效来自"foo"类型的右值

如果你修复代码,通过

std::string my_func()
{
    const auto &x = bar();
    return x.value;
}

那么它也可以,因为const引用将temporary的生存期延长为const引用的生存期。

简短回答:没有。

更长的答案:在这种情况下,编译器将确保引用的临时对象将存在于当前作用域的末尾。bar()按值返回n个对象。它将被复制到一个临时的匿名对象中,然后引用将引用该临时对象。

还有其他类似的情况,标准有这个明确的要求:绑定到引用的临时性一直存在,直到达到当前范围的末尾。

否,字符串被复制到返回值中。x引用的对象在函数之后超出范围。

这不是泄漏,您的引用只是指向由于临时对象而通过堆栈展开清理的内存。

访问x将导致未定义的行为。可能是访问违规。