【发布时间】:2018-04-30 03:46:55
【问题描述】:
我编写了一个 c++ 函数,它组装一些数据,然后将 std::shared_ptr 返回到包含数据的新分配的 std::vector。类似的东西:
std::shared_ptr<std::vector<int>> shared_ptr_to_std_vector_of_ints()
{
auto v = std::make_shared<std::vector<int>>();
for (int i = 0; i < 3; i++) v->push_back(i);
return v;
}
我尝试使用基于范围的 for 循环来迭代向量的内容,但它的行为就像向量为空一样。在摆弄之后,我发现我可以通过将函数返回的值分配给局部变量,然后在循环中引用它来让它按预期运行:
// Executes loop zero times:
std::cout << "First loop:" << std::endl;
for (int i : *shared_ptr_to_std_vector_of_ints()) std::cout << i << std::endl;
// Prints three lines, as expected
std::cout << "Second loop:" << std::endl;
auto temp = shared_ptr_to_std_vector_of_ints();
for (int i : *temp) std::cout << i << std::endl;
剪掉的会打印这个:
First loop:
Second loop:
1
2
3
为什么第一个版本不起作用?
我在 macOS Sierra 10.12.6 上使用 Xcode。我相信它正在使用 LLVM 9.0 来编译 c++ 代码。
【问题讨论】:
-
你真的需要
shared_ptr围绕std::vector(因为std::vector已经管理内存)? (尤其适用于提供的用法)。
标签: c++ c++11 shared-ptr ranged-loops