提问人:decarlo46 提问时间:3/15/2021 更新时间:3/15/2021 访问量:477
在 C++ 中将 std::vector 传递给函数时的内存分配
Memory allocation when passing a std::vector to a function in C++
问:
请看以下简单示例:
#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 循环后使用时会出现内存错误,但似乎代码工作正常。vec
output->resize(10000)
vec
func
你能解释一下这种行为吗?另外,这是你写这段代码的方式吗(即,当你需要一个应该填充向量的函数时,也许每次都用不同数量的值,尽管这里是)?(附言。我不想使用)。10000
return
谢谢!
答:
1赞
francesco
3/15/2021
#1
从参考:std::vector
向量的存储是自动处理的,正在扩展和 根据需要签订合同。
正是这种质量使它非常易于使用。std::vector
在代码中
*output = temp;
该行将向量复制到 ,即调用赋值运算符。您不必考虑如何在内部完成此操作,但您可以假设在此之后,指向的向量包含 的副本。temp
output
output
temp
评论
0赞
decarlo46
3/15/2021
谢谢。所以在我里面的实际代码中,调用了一些其他函数来产生一个(大)向量(比如)。这是将 的值传递给 main 的“正确”方式吗?(即,通过指针?func
temp
temp
0赞
Sam Varshavchik
3/15/2021
您的 C++ 教科书应该详细讨论在函数之间传递对象的不同方法:使用指针、引用和其他方法。在 C++ 中,没有一种“正确”的方法可以在所有情况下都普遍正确。为了对特定情况的适当方法做出明智的决定,有必要充分了解各种选项之间的区别。
0赞
decarlo46
3/15/2021
@SamVarshavchik 谢谢山姆。所以这是我的具体情况:我有一个像 main 这样的函数,它调用另一个函数(如上面的例子中)来获得 的(大)向量。但它本身调用了第三个函数,该函数在 .现在我想知道将这个向量从 back 传递到 main 的合适方法是什么?(不使用,因为它已经用于其他用途)func
int
func
func
func
return
1赞
Sam Varshavchik
3/15/2021
这仍然过于宽泛和笼统,无法识别单一的解决方案。正如我所写的:“为了对给定情况的适当方法做出明智的决定,有必要充分了解各种选项之间的区别”,包括指针和参考。而且没有定律说,无论如何,一个函数只能有一个值。这就是目的。这并不意味着这将是最优化的解决方案,它只是展示了各种各样的可用选项。return
std::tuple
下一个:报表生成器日期问题
评论
func
temp
operator[]
.size()
.at(i)
i