@GoH_HoG

Как исправить ошибку сегментации C++ (segmentation fault)?

Пишу небольшое учебное задание для ВУЗа. Нужно написать класс с использованием динамического массива. Класс и основные методы написаны, но почему-то когда я реализовал меню (с бесконечным циклом) у меня стала возникать ошибка: zsh: segmentation fault, при попытке добавить новый элемент в массив. При вызове других методов, подобной ошибки нет. Причем если полностью удалить цикл while true, и по отдельности вызвать методы класса все работает.

Код
#include <iostream>
#include <string>

using namespace std;

class Films {
private:

    string name_of_film;
    string film_genre;
    int year;
    string name_of_director;
    double price;

public:
/* Конструктор по умолчанию*/
    Films() { 
        name_of_film="", 
        film_genre = "", 
        year = 0, 
        name_of_director = "", 
        price = 0.;
    }

    int get_year() {return year;}

    void chek(const string &f_name, const string &f_genre, int f_year, const string &n_of_director, double pr) {
        name_of_film = f_name;
        film_genre = f_genre;
        if (f_year<1895) {
            year = 0;
            cout << "Год создания не может быть меньше 1985!" << endl;
        } else {
            year = f_year;
        }
        
        name_of_director = n_of_director;
        price = pr;
    };

    void edit();

    void show() {
        cout << "Название фильма: " << name_of_film << endl;
        cout << "Жанр фильма: " << film_genre << endl;
        cout << "Год выпуска фильма: " << year << endl;
        cout << "Режисер фильма: " << name_of_director << endl;
        cout << "Стоимость фильма($): " << price << endl;
    };
    void add() {
        cout << "Введите навание фильма: ";
        cin >> name_of_film;
        cout << "Введите жанр фильма: ";
        cin >> film_genre;
        cout << "Введите год фильма: ";
        cin >> year;
        cout << "Введите режисера фильма: ";
        cin >> name_of_director;
        cout << "Введите стоимость фильма: ";
        cin >> price;
    };
};

Films* add(Films *f, int n) {
    Films* result = new Films [n+1];
    for (int i=0; i<n; i++)
        result[i]=f[i];
    result[n].add();
    delete [] f;
    return result;

}

Films* del(Films *f, int n, int k) {
    Films* result = new Films [n-1];
    for (int i=0; i<n-1; i++)
        if (i<k)
            result[i]=f[i];
        else if (i >= k)
            result[i]=f[i+1];
    delete [] f;
    return result;

}

void sort(Films *f,int n){
    Films temp;
    for (int i=0; i<n-1; i++)
        for (int j=i+1; j<n; j++)
            if (f[i].get_year() < f[j].get_year()) {  
                temp = f[i];
                f[i] = f[j];
                f[j] = temp;
            }
}

int main() {
    setlocale(LC_ALL, "ru");
    
    Films* film;
    int n = 0;
    int ch = 0;

    cout << "==========Начало работы программы============" << endl;
    
    while (true) {
        
        cout << "==========Выберите действие============" << endl;
        cout << "Нажмите 1, чтобы добавить информацию о фильме." << endl
        << "Нажмите 2, чтобы удалить информацию о фильме." << endl
        << "Нажмите 3, чтобы редактировать информацию о фильме." << endl
        << "Нажмите 4, чтобы отсортировать список фильмов" << endl
        << "Нажмите 5, чтобы завершить работу программы." << endl;
        cout << endl <<  "Введите значение: ";
        cin >> ch;
        
        if (ch == 5) {
            cout << "==========Конец============" << endl;
            break;
        } else if (ch == 1) {
            
            film = add(film, n); 
            n+=1;
        } else if (ch == 2) {
            int d;
            cout << endl << "Введите номер удаляемого элемента: ";
            cin >> d;
            del(film, n, d); 
        } else if (ch == 3) {
            cout << "В разработке" << endl;
        } else if (ch == 4) {
            sort(film, n);
        } else {
            cout << "Введено не корректное значение!" << endl;
            cout << "==========Конец============" << endl;
            break;
        }
            
        cout << "======Наш список данных====== " << endl;
        
        for (int i=0; i<n; i++)
            film[i].show();
    }

    return 0;
}
  • Вопрос задан
  • 1112 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Segmentation fault - это ошибка работы с памятью. Ваша программа вылезает за границы вашей памяти или делаете что-то не то с указателями.

Одна очевидная ошибка - вы не уменьшаете n при удалении элемента. И тогда на следующей итерации вы будете что-то делать с элементом за концом массива.

Еще одна ошибка у вас в том, что вы в add, например, всегда удаляете указатель на f. А в самом начале этот указатель неинициализирован. Удаление такого случайного указателя - это undefined behavior. Программа может упасть сразу, а может только на следующей итерации цикла.

Советую инициализировать f в nullptr и перед удалением всегда проверять, что удаяемый казатель не нулевой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы