我有一个循环,在其中创建一个unique_ptr并将其移动到向量中。我还需要将其存储在另一个向量中,因此我要使用第一个向量的end()
方法将其引用存储在另一个向量中。
由于某种原因,我碰巧遇到一些无效的读取错误,这些错误似乎影响了包含引用的列表的最后一个元素之前的元素。
下面是一个简单的片段,用以说明我的话:
#include <iostream>
#include <memory>
#include <vector>
int main(void)
{
std::vector<std::unique_ptr<int>> other;
std::vector<std::reference_wrapper<std::unique_ptr<int>>> vec;
for (int it = 0; it < 2; ++it)
{
std::unique_ptr<int> ptr = std::make_unique<int>(it);
other.push_back(std::move(ptr));
vec.push_back(*(other.end() - 1));
}
for (auto &it : vec)
std::cout << "Vec: " << *it.get() << std::endl;
return 0;
}
这将输出如下内容:
$ ./a.out
Vec: 35716160
Vec: 1
如您所见,第一个元素包含垃圾,我怀疑从第一个向量的end()
推入会导致问题,但我似乎无法弄清楚为什么。
答案 0 :(得分:3)
您正在引用存储在向量中的元素。只要向量不自行调整大小,就可以了,因为元素的存储位置不会改变。但是,一旦vec
向量需要调整大小以容纳比其容量更多的元素,它就会将其所有当前元素移至新的后备存储块,并且您现在使用的引用是指释放的内存(即垃圾)。