В настоящее время изучаю C ++, создающую небольшую программу, которая принимает названия фильмов, сохраняет их в векторе и затем выводит их на основе пользовательского ввода. Проблема в том, что я сделал функцию отображения списка фильмов. Теперь каждый раз, когда я запускаю эту функцию, я получаю эту ошибку:

Необработанное исключение в 0x769DA842 в ConsoleApplication2.exe: исключение Microsoft C ++: std :: out_of_range в ячейке памяти 0x0113F674.

Вот код:

#include <iostream>
#include <vector>

std::vector <std::string> movieList;
std::vector <int>::iterator it;

void AddMovie(std::string movie)
{
    movieList.push_back(movie);
}

void DeleteMovie(int i)
{
    movieList.erase(movieList.begin() + i - 1);
}

void ShowMovies()
{
    for (int i = 0; movieList.size() > 1; i++)
    {
        std::cout << movieList.at(i) << std::endl;
    }
}

int main()
{

    int i{ 0 };

    movieList.push_back("Inception");
    movieList.push_back("Peter Pan");
    movieList.push_back("Jaws");

    std::cout << "Delete movie: ";
    std::cin >> i;
    DeleteMovie(i);
    ShowMovies();

    
}

Ошибка прерывается на строке

std :: cout << movieList.at (i) << std :: endl;

1
AdamKxZ 9 Фев 2021 в 21:54

1 ответ

Лучший ответ

В цикле for условие movieList.size ()> 1 всегда истинно (если у вас более одного фильма в списке), поэтому вы увеличиваете i сверх размера списка, получая доступ в память вне диапазона вектора.

Этот пример должен работать, поскольку переменная i используется только в теле цикла, пока не достигнет значения movieList.size () - 1 (как @ user4581301 прокомментировал выше, она увеличивается до movieList.size ( ), но это последнее значение не используется в теле цикла):

void ShowMovies()
{
    for (int i = 0; i < movieList.size(); i++)
    {
        std::cout << movieList.at(i) << std::endl;
    }
}
1
Alberto Casas Ortiz 9 Фев 2021 в 19:17