Jus*_*ois 1 c++ syntax return-by-reference
我知道如果引用的变量也通过引用传递给函数,那么通过引用返回是没有问题的.例如:
int& foo(int& bar)
{
bar++;
return bar;
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道如果你通过关键字返回一个在函数中创建的对象,是否也可以通过引用返回new.我尝试了类似下面的内容,但遇到了编译器错误:
vector<int>& baz()
{
return new vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通过引用返回新的向量是有意义的,还是只返回指针更好?
从技术上讲,您当然可以通过引用返回动态分配的对象:
vector<int>& baz()
{
return *new vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
注意*用于取消引用返回的指针new.
这样做是否明智是一个完全不同的鱼.它是内存泄漏的主要候选者.如果你这样做,调用者负责调用delete返回的对象,否则它被泄露.请注意,使用以下任一方案都可以轻松实现:
std::vector<int> v1 = baz(); // leak!
auto v2 = baz(); // leak!, auto doesn't deduce references
Run Code Online (Sandbox Code Playgroud)
在现代C++中,你应该简单地按值返回向量,让移动语义和/或(命名)返回值优化完成它的工作:
std::vector<int> baz()
{
return std::vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因需要动态分配,至少应该返回一个合适的智能指针,以确保不会发生内存泄漏:
std::unique_ptr<std::vector<int>> baz()
{
return std::unique_ptr<std::vector<int>>(new std::vector<int>());
}
Run Code Online (Sandbox Code Playgroud)