在 C++ 中将 std::vector 传递给函数时的内存分配

Memory allocation when passing a std::vector to a function in C++

提问人:decarlo46 提问时间:3/15/2021 更新时间:3/15/2021 访问量:477

问:

请看以下简单示例:

#include <vector>

void func(std::vector<int>* output) {
  std::vector<int> temp(10000);
  /* ... do work here and fill temp with useful values ... */

  // now send the result to main
  *output = temp;
}

int main(void) {
  std::vector<int> vec;
  // func will put useful values in vec
  func(&vec);

  for(size_t i=0; i<10000; i++)
    vec[i] = 3; // just checking to see if I get a memory error

  return 0;
}

我曾经认为在能够使用它之前必须首先分配内存(例如,通过调用?因此,我预计在调用 for 循环后使用时会出现内存错误,但似乎代码工作正常。vecoutput->resize(10000)vecfunc

你能解释一下这种行为吗?另外,这是你写这段代码的方式吗(即,当你需要一个应该填充向量的函数时,也许每次都用不同数量的值,尽管这里是)?(附言。我不想使用)。10000return

谢谢!

C++ 指针 参数传递 dynamic-memory-allocation

评论

0赞 drescherjm 3/15/2021
您可能应该通过引用而不是指针传递向量。
0赞 JohnFilleau 3/15/2021
您可以摆脱这种情况,因为向量的赋值运算符是这样设计的。以直观和简单的方式工作的对象被大量使用。Vector 被大量使用。
0赞 decarlo46 3/15/2021
谢谢你们俩。@drescherjm 所以在我里面的实际代码中,调用了一些其他函数来产生一个(大)向量(类似于)。由于这是一个局部变量(在 func 中),我不确定通过引用传递是否有效?functemp
0赞 alter_igel 3/15/2021
请注意,使用越界读取向量是未定义的行为,并不能以任何方式保证崩溃或错误。如果你想确定你的向量的大小,你应该简单地查询它,并直接根据你的期望进行检查。或者,可以使用 ,每当超出界限时都会引发异常。operator[].size().at(i)i

答:

1赞 francesco 3/15/2021 #1

参考std::vector

向量的存储是自动处理的,正在扩展和 根据需要签订合同。

正是这种质量使它非常易于使用。std::vector

在代码中

*output = temp;

该行将向量复制到 ,即调用赋值运算符。您不必考虑如何在内部完成此操作,但您可以假设在此之后,指向的向量包含 的副本。tempoutputoutputtemp

评论

0赞 decarlo46 3/15/2021
谢谢。所以在我里面的实际代码中,调用了一些其他函数来产生一个(大)向量(比如)。这是将 的值传递给 main 的“正确”方式吗?(即,通过指针?functemptemp
0赞 Sam Varshavchik 3/15/2021
您的 C++ 教科书应该详细讨论在函数之间传递对象的不同方法:使用指针、引用和其他方法。在 C++ 中,没有一种“正确”的方法可以在所有情况下都普遍正确。为了对特定情况的适当方法做出明智的决定,有必要充分了解各种选项之间的区别。
0赞 decarlo46 3/15/2021
@SamVarshavchik 谢谢山姆。所以这是我的具体情况:我有一个像 main 这样的函数,它调用另一个函数(如上面的例子中)来获得 的(大)向量。但它本身调用了第三个函数,该函数在 .现在我想知道将这个向量从 back 传递到 main 的合适方法是什么?(不使用,因为它已经用于其他用途)funcintfuncfuncfuncreturn
1赞 Sam Varshavchik 3/15/2021
这仍然过于宽泛和笼统,无法识别单一的解决方案。正如我所写的:“为了对给定情况的适当方法做出明智的决定,有必要充分了解各种选项之间的区别”,包括指针和参考。而且没有定律说,无论如何,一个函数只能有一个值。这就是目的。这并不意味着这将是最优化的解决方案,它只是展示了各种各样的可用选项。returnstd::tuple