Вектор ссылок на уникальный Ptr недопустимое чтение - PullRequest
0 голосов
/ 27 июня 2018

У меня есть цикл, в котором я создаю 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 голосов
/ 27 июня 2018

Вы берете ссылку на элемент, хранящийся в векторе. Это нормально, если вектор не меняет свой размер, так как место хранения элемента не изменится. Но, как только вектор vec должен изменить размер, чтобы вместить еще один элемент, чем его емкость, он перемещает все свои текущие элементы в новый блок резервной памяти, и ссылки, которые вы взяли сейчас, ссылаются на освобожденную память (т.е. мусор) .

...