Read access violation при удалении объекта структуры

321
23 января 2017, 19:28

Имеется такая структура:

struct account {
    string  login;
    string  pass;
    bool    admin;
};

И такая функция:

bool auth() {
    account user;
    account input;
    ifstream fin("users.bin", ios::binary | ios::in);
    if (fin.is_open()) {
        while (true) {
            system("cls");
            cout << "login: ";
            getline(cin, input.login);
            cout << "pass: ";
            getline(cin, input.pass);
            while (!fin.eof()) {
                fin.read((char*)&user, sizeof(user));
                if (input.login == user.login && input.pass == user.pass) {
                    fin.close();
                    system("cls");
                    cout << "hello, " << user.login << "\n" << endl;
                    cout << "press any key...";
                    _getwch();
                    return user.admin;
                }
            }
            system("cls");
            cout << "Incorrect login or password\n" << endl;
            cout << "press any key...";
            _getwch();
            fin.clear();
            fin.seekg(0, ios::beg);
        }
    }
    else {
        cout << "File is not avalible" << endl;
        abort();
    }
}

При завершении работы функции именно у объекта user, видимо, не получается удалиться, и вызывается исключение read access violation

Answer 1
fin.read((char*)&user, sizeof(user));

Вот так - просто в память - можно считывать только то, что называется POD - plain old data. Тот же string - это сложный класс, в котором хранятся указатели на динамически выделенную память и т.п. вещи. Вы считали какой-то указатель, который когда-то - в другой программе, быть может - указывал в какое-то правильное, корректно выделенное место в памяти. А теперь куда он указывает?
Именно. Хрен знает куда.
Потому и получается хрен знает что, когда программа пытается корректно освободить память - непонятно какую, непонятно где.

Категорически нельзя так хранить серьезные вещи. Тот же string, если нужно бинарное хранение, лучше записать как целое число - количество символов, а потом сами символы. А затем, когда считываете, сначала считываете длину, готовите соответствующий буфер, читаете в него строку и собираете объект string.

READ ALSO
Длительное нажатие button как осуществить?

Длительное нажатие button как осуществить?

среда разработки: RADstudio c++builder (разработка под android)

266
Undefined reference to member of class in library

Undefined reference to member of class in library

Итак, у меня есть 1 тестовое приложение и 1 библиотека, которая подключается к приложениюПроблема заключается в том, что, функции неопределенны,...

313
Какие отличия функций c++ от функций в c? [требует правки]

Какие отличия функций c++ от функций в c? [требует правки]

Какие отличия функций c++ от функций в c?

259
Программа на C++ . Метод последовательного перебора [требует правки]

Программа на C++ . Метод последовательного перебора [требует правки]

Помогите пожалуйста, прогорает экзаменсделать прогу на C++

571