如果从方法返回引用会导致内存泄漏,我非常好奇。以下是示例情况。
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_val
退出时,test_vect
和test_run
从堆栈中移除。是{@ 1}}还是test_vect
被删除,从而导致对象被破坏?
答案 0 :(得分:16)
没有。其他内容的引用是别名(或名称)。您可以将它视为一个从不拥有指针,指向没有指针语义的东西(以及它们的缺陷,尽管引用本身有一些曲折)。
当函数test_run
退出时,引用只有它们消失了。他们提到的内容并没有被记忆所触及,也没有被删除。
此外,由于您只处理具有自动存储持续时间且在构造过程中不涉及动态内存的变量,因此您无法在那里发生内存泄漏。您可能会遇到其他问题,例如尝试删除指向此类变量的指针(尝试生成 core dump on coliru )但不会泄漏。
答案 1 :(得分:8)
否。如果您没有使用new
分配内存,那么为什么它会导致内存泄漏,这意味着堆 EM>?所有变量都分配在堆栈上。对于其他变量,引用只是别名。
根据wikipedia
的C ++参考定义:
C ++中引用的定义是不需要的 存在。它可以实现为现有对象的新名称。
还有一个paragraph谈论指针和引用之间的区别。