Вызывается исключение: нарушение доступа для чтения после delete []

void user_reg() {
    string temp;
    int age;

    FILE* f = fopen("users.txt", "a");

    if (f == NULL)
    {
        cout << "Файла не существует\n\n";
        return;
    }

    User u;

    cout << "Введите имя пользователя: ";
    getline(cin, temp);
    u.Set_name(temp);

    cout << "Введите пароль: ";
    getline(cin, temp);
    u.Set_password(temp);

    cout << "Введите возраст: ";
    cin >> age;
    u.Set_age(age);
    cin.ignore();

    cout << "Введите номер телефона: ";
    getline(cin, temp);
    u.Set_phoneNumber(temp);

    cout << "Введите email: ";
    getline(cin, temp);
    u.Set_email(temp);

    fwrite(&u, sizeof(u), 1, f);

    fclose(f);

    return;
}

void user_aut() {
    int i = 0;
    string name;
    bool user_exist = false;

    FILE* f = fopen("users.txt", "r");

    if (f == NULL)
    {
        cout << "Файла не существует\n\n";
        return;
    }

    long ch = _filelength(_fileno(f)) / sizeof(User);

    User* mas = new User[ch];


    cout << "Введите имя пользователя: ";
    getline(cin, name);

    if (!fread(mas, sizeof(User), ch, f))
    {
        cout << "Пользователей с таким именем не существует\n\n";
        delete[] mas;
        fclose(f);
        return;
    }


    for (i; i < ch; i++)
    {
        if (mas[i].Get_name() == name)
        {
            user_exist = true;
            break;
        }
    }

    if (user_exist)
    {
        cout << "Введите пароль: ";
        getline(cin, name);
        if (mas[i].Get_password() == name) {
            cout << "\nВход успешен";
        }
    }
    else {
        cout << "Пользователей с таким именем не существует\n\n";
    }

    fclose(f);

    delete[] mas;

    return;

}

Структура

struct User {
private:
    string name;
    string password;
    string phoneNumber;
    string email;
    int age;
public:
    User() {
        age = 0;
        name = "0";
        password = "0";
        phoneNumber = "0";
        email = "0";

    }


    User(string name, string password, string phoneNumber, string email, int age) {
        this->age = age;
        this->name = name;
        this->password = password;
        this->phoneNumber = phoneNumber;
        this->email = email;
    }

    void Set_name(string name) {
        this->name = name;
    }

    string Get_name() {
        return name;
    }

    void Set_password(string password) {
        this->password = password;
    }

    string Get_password() {
        return password;
    }

    void Set_phoneNumber(string phoneNumber) {
        this->phoneNumber = phoneNumber;
    }

    string Get_phoneNumber() {
        return phoneNumber;
    }

    void Set_email(string email) {
        this->email = email;
    }

    string Get_email() {
        return email;
    }

    void Set_age(int age) {
        this->age = age;
    }

    int Get_age() {
        return age;
    }

    void inform() {
        cout << "Имя: " << name << "\nВозраст: " << age << "\nНомер телефона: " << phoneNumber << "\nEmail: " << email << endl << endl;
    }

};

В первой функции произвожу запись объекта структуры в файл через fwrite, во второй функции считываю все объекты из файла с помощью fread в массив и нахожу объект у которого имя будет совпадать с тем что я ввожу с клавиатуры. Ошибка возникает при попытке освободить память при помощи delete[] во второй функции, причем появляется она только после fread. С чем это связано и как это исправить?


Ответы (0 шт):