唯一 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
向量需要调整大小以容纳比其容量多一个元素,它会将所有当前元素移动到一个新的后备内存块,并且您现在引用的引用是指已释放的内存(即垃圾)。
我有一个循环,我在其中创建一个 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
向量需要调整大小以容纳比其容量多一个元素,它会将所有当前元素移动到一个新的后备内存块,并且您现在引用的引用是指已释放的内存(即垃圾)。