在C ++中通过引用返回

时间:2014-10-15 20:05:45

标签: c++ syntax return-by-reference

我知道如果引用的变量也通过引用传递给函数,那么通过引用返回是正常的。例如:

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

但是,如果您通过{{1>返回函数中创建的对象,我想知道是否可以通过引用返回关键字。我尝试了类似下面的内容,但遇到了编译错误:

new

有没有办法通过引用返回新的向量是有意义的,还是只返回指针更好?

3 个答案:

答案 0 :(得分:5)

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

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 ++中,你应该只是按值返回向量,让移动语义和/或(Named) Return Value Optimisation完成它的工作:

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>());
}

答案 1 :(得分:2)

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

双重否否。

只需按值返回并利用copy-elision(参见:What are copy elision and return value optimization?)和move-semantics(参见:What are move semantics?

答案 2 :(得分:1)

new vector<int>();

实际上返回一个指针。

如果你真的想记忆泄漏,请写下:

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