在C ++中返回一个向量

时间:2013-12-18 11:53:00

标签: c++ vector stl

我刚读了this post on 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

,这会改变吗?

3 个答案:

答案 0 :(得分:8)

您的代码非常精确。

Vectors管理他们为你分配的所有内存。

它们是否使用动态分配存储所有内部数据无关紧要,或者将某些元数据保存为直接成员(自动存储持续时间)。内部执行的任何动态分配都将在向量的析构函数,复制构造函数和其他类似的特殊函数中安全地清理。

您不需要做任何事情,因为所有这些都是从代码中抽象出来的。您的代码无法看到该机制,动态分配向量本身不会对其产生任何影响。

这就是他们的目的!

答案 1 :(得分:2)

如果您决定动态分配矢量,即使在非常简单的情况下也很难正确地销毁它(不要忘记异常!)。尽可能不惜一切代价避免动态分配。

换句话说,您的代码完全正确。我不担心在内存中复制返回的向量。在这些简单的情况下,编译器(在发布版本中)应该使用返回值优化/ 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的模式。或者使用智能指针。

答案 2 :(得分:1)

内部向量定义数据的位置并不重要,因为你通过复制返回向量。:)(按值)它就像返回一个整数一样

int some_function()
{
   int x = 10;
   return x;
}