引用会导致内存泄漏吗
Can references cause memory leaks?
考虑以下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将导致未定义的行为。可能是访问违规。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存