唯一 Ptr 引用向量无效读取

Vector Of References To Unique Ptr Invalid Read

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

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