在C++中通过引用返回

Returning by reference in C++

本文关键字:引用 返回 C++      更新时间:2023-10-16

我知道,如果被引用的变量也通过引用传递到函数中,那么通过引用返回是可以的。例如:

int& foo(int& bar)
{
    bar++;
    return bar;
}

但是,我想知道如果您通过new关键字返回函数中创建的对象,是否也可以通过引用返回。我尝试了如下操作,但出现了编译器错误:

vector<int>& baz()
{
    return new vector<int>();
}

有没有一种方法可以通过引用返回新向量,或者只返回一个指针更好?

从技术上讲,您当然可以通过引用返回动态分配的对象:

vector<int>& baz()
{
    return *new vector<int>();
}

请注意用于取消引用new返回的指针的*

这样做是否明智完全是另一回事。它是内存泄漏的主要候选者。如果你这样做,调用者负责对返回的对象调用delete,否则它就会泄漏。请注意,对于以下任何一种情况,这都很容易发生

std::vector<int> v1 = baz(); // leak!
auto v2 = baz(); // leak!, auto doesn't deduce references

在现代C++中,您应该简单地按值返回向量,并让move语义和/或(命名)返回值优化来完成它的工作:

std::vector<int> baz()
{
  return std::vector<int>();
}

如果由于某种原因需要动态分配,您至少应该返回一个合适的智能指针,以确保不会发生内存泄漏:

std::unique_ptr<std::vector<int>> baz()
{
  return std::unique_ptr<std::vector<int>>(new std::vector<int>());
}

关于:Is there a way to return the new vector by reference that makes sense, or is it better to just return a pointer?

双重无编号

只需按值返回并利用复制省略(参见:什么是复制省略和返回值优化?)和移动语义(参见:哪些是移动语义?)

new vector<int>();

实际上返回一个指针。

如果你真的喜欢内存泄漏,写下这样的:

return *(new std::vector<int>());