我有一个循环,我在其中创建一个 unique_ptr 并将其移动到一个 vector 中。我还需要将其存储在另一个 vector 中,因此我使用第一个 vector 的 end()
方法将其引用存储在另一个 vector 中。
由于某种原因,我碰巧遇到了一些无效的读取错误,这些错误似乎影响了包含引用的列表的最后一个之前的元素。
这是一个简单的片段来说明我的说法:
#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
正如您所看到的第一个元素包含垃圾,我怀疑从第一个 vector 的 end()
推送会导致问题,但我似乎不明白为什么。
最佳答案
您正在引用存储在 vector 中的元素。只要 vector 不自行调整大小就可以了,因为元素的存储位置不会改变。但是,一旦 vec vector 需要调整大小以容纳比其容量多的元素,它就会将其所有当前元素移动到新的后备内存块,并且您现在获取的引用引用已释放的元素内存(即垃圾)。
关于c++ - 对唯一 Ptr 的引用 vector 无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067140/