在C++中通过引用返回
Returning by reference in C++
我知道,如果被引用的变量也通过引用传递到函数中,那么通过引用返回是可以的。例如:
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>());
相关文章:
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量