以C++返回向量

Returning a vector in C++

本文关键字:向量 返回 C++      更新时间:2023-10-16

我刚刚在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;
}