以C++返回向量
Returning a vector in C++
我刚刚在SO上读了这篇文章,讨论了STL向量的存储位置。根据接受的答案,
vector<int> temp;
堆栈上向量的标头信息,但堆上的内容。
在这种情况下,以下代码会出错吗?
vector<int> some_function() {
vector<int> some_vector;
some_vector.push_back(10);
some_vector.push_back(20);
return some_vector;
}
我应该改用vector<int> *some_vector = new vector<int>
吗?上面的代码会导致一些内存分配问题吗?如果我使用自定义类的实例而不是int
,这会改变吗?
你的代码很好。
矢量管理它们为您分配的所有内存。
无论它们是使用动态分配存储所有内部数据,还是将某些元数据作为直接成员(具有自动存储持续时间)保存,都无关紧要。内部执行的任何动态分配都将在向量的析构函数、复制构造函数和其他类似的特殊函数中安全地清理。
您不需要执行任何操作,因为所有这些都是从代码中抽象出来的。您的代码无法看到该机制,动态分配向量本身不会对其产生任何影响。
这就是他们的目的!
如果你决定动态分配向量,即使在非常简单的情况下,你也很难正确地销毁它(不要忘记例外!尽可能避免不惜一切代价进行动态分配。
换句话说,你的代码是完全正确的。我不会担心在内存中复制返回的向量。在这些简单的情况下,编译器(在发布版本中)应使用返回值优化/RVO(http://en.wikipedia.org/wiki/Return_value_optimization)并在返回对象的内存中创建some_vector。在 C++11 中,您可以使用移动语义。
但是,如果您真的不信任使用 RVO 的编译器,则始终可以将对向量的引用传递给它并将其填充到函数中。
//function definition
void some_function(vector<int> &v) { v.push_back(10); v.push_back(20); }
//function usage
vector<int> vec;
some_function(vec);
回到动态分配,如果你真的需要使用它,试试称为RAII的模式。或者使用智能指针。
内部向量在哪里定义其数据并不重要,因为您通过复制返回向量:)(按值)这与返回整数相同
int some_function()
{
int x = 10;
return x;
}
- 矩阵向量乘法(cublasDgemv)返回零
- C++中函数的向量返回类型引发错误
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 从对象的向量返回某个类的对象
- C++ 将向量中出现 n 次的所有元素作为向量返回
- 向量返回负大小 c++
- 如何从向量返回给定类型的元素?
- 将对象的向量返回到函数
- 尝试从向量返回对象时出现"没有可行的重载运算符 [] 错误
- 调用函数时,如何通过向量返回类型
- 向量返回/加法算法的问题
- 在向量返回上移动语义行为
- 从int c++的向量返回一个无符号长
- 向量返回空 C++
- 从融合向量的std向量返回列,无需复制
- C++为空向量上的向量返回什么::back()
- 函数的向量返回
- 如何用适当的OO有效地将100万的私有向量返回给其他几个类