唯一Ptr无效读取的参考向量

时间:2018-06-27 16:04:29

标签: c++ reference unique-ptr

我有一个循环,在其中创建一个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()推入会导致问题,但我似乎无法弄清楚为什么。

1 个答案:

答案 0 :(得分:3)

您正在引用存储在向量中的元素。只要向量不自行调整大小,就可以了,因为元素的存储位置不会改变。但是,一旦vec向量需要调整大小以容纳比其容量更多的元素,它就会将其所有当前元素移至新的后备存储块,并且您现在使用的引用是指释放的内存(即垃圾)。