返回常量引用或引用的方法是否会导致内存泄漏

Can methods that return const reference or references cause memory leaks?

本文关键字:引用 内存 泄漏 方法 常量 返回 是否      更新时间:2023-10-16

我非常好奇从方法返回引用是否会导致内存泄漏。以下是示例情况。

class example
{
public:
  vector<int> & get_vect()
  {
     return vect;
  }
  int & get_num()
  {
    return num;
  }
private:
  vector<int> vect;
  int num;
};

void test_run(example & input)
{ 
   int & test_val = input.get_num();
   vector<int> & test_vect = input.get_vect();
}
int main()
{
  example one;
  test_run(one);
  return 0;
}

我的问题是当test_run退出时,test_valtest_vect何时从堆栈中移除。test_vecttest_val是否被删除,从而导致对象1损坏?

否。引用是其他事物的别名(或名称)。您可以将其视为一个从不拥有指针,指向没有指针语义的东西(以及它们的陷阱,尽管引用本身也有一些曲折)。

当函数test_run退出时,引用(并且只有它们)将消失。他们提到的内容在记忆方面没有被触及,也没有被删除。

此外,由于您只处理具有自动存储持续时间的变量,并且在构建过程中不涉及动态内存,因此不可能出现内存泄漏。您可能会遇到其他问题,比如试图删除指向此类变量的指针(尝试只在coliru上产生核心转储),但不会泄漏。

如果不使用new分配内存,也就是说在堆上,为什么会导致内存泄漏?所有变量都分配在堆栈上。引用只是其他变量的别名

根据wikipedia:的C++参考定义

C++中引用的定义是这样的:存在它可以实现为现有对象的新名称。

还有一段谈到了指针和引用之间的区别。