我知道如果引用的变量也通过引用传递给函数,那么通过引用返回是正常的。例如:
int& foo(int& bar)
{
bar++;
return bar;
}
但是,如果您通过{{1>返回在函数中创建的对象,我想知道是否可以通过引用返回关键字。我尝试了类似下面的内容,但遇到了编译错误:
new
有没有办法通过引用返回新的向量是有意义的,还是只返回指针更好?
答案 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>());