c++ - 对唯一 Ptr 的引用 vector 无效读取

标签 c++ reference unique-ptr

我有一个循环,我在其中创建一个 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/

相关文章:

c++ - 符合标准的 C++ 实现如何表明它不知道当前日期和时间?

c++ - 调用派生的基类函数

C++ 指向指针范围问题的指针

string - Excel 匹配函数与具有 R1C1 引用样式的列

使用 std::move(nullptr) 的 unique_ptr 的 operator= C++ 错误

c++ - 在 C++ 中使用 std::unique_ptr 管理原始内存

C++ 如何将二进制文件的一部分复制到新文件?

c++ - 什么时候通过引用传递函数参数,什么时候通过地址传递?

c - &variable 作为表达式在 c 中意味着什么

c++ - 带有数组的 unique_ptr 有什么用吗?