• При завершении работы программы падает исключение, что делать?

    @Mercury13
    Программист на «си с крестами» и не только
    Это испорченная память, где-то ошибка в управлении памятью (например, запись за границами массива).
    UPD. Ваша ошибка: в составе std::string есть внутренние неконтролируемые поля, и его нельзя побайтово сохранять в файл. Такими неконтролируемыми полями могут быть указатели, кэши-ускорители и многое другое. Вообще std::string состоит из указателя или двух, и отсюда следуют две вещи. 1) При сохранении в файл не попадут строковые данные, попадёт только указатель. К тому же в Windows нет хорошего 16-ричного просмотрщика, а без него при работе с файлами как без рук (по крайней мере начинающему, я давно обхожусь). 2) Как только вы этот указатель загрузите, std::string портится, и на деструкторе может случиться что угодно.

    Вам надо самим придумать формат файла и реализовать загрузку/сохранение, используя length(), data() и front().

    Важное правило: ткни в любой байт дампа вашего файла — вы должны сказать, что он значит. Из-за сложности формата это может быть сложно. Байт может быть неиспользуемым или оставленным для совместимости, но какое-то значение должно быть. Если формат многоуровневый, надо сказать назначение на всех уровнях: например, «это значение атрибута XML» на уровне XML и «это имя студента» на прикладном уровне.

    Исключение: если есть объект-«чёрный ящик», который написан не нами и сериализуется гарантированно корректно, достаточно сказать: «это часть чёрного ящика». (Сериализуется — это переводится в цепочку байтов, например, файл или сетевой поток.)

    Что ещё пока вижу (но это не причина ошибки).
    1.
    unsigned short int *exam_t = new unsigned short int[5];
    Нет нужды new, невелик массив. Хватает локального массива на стеке. Аналогично остальные два new.
    2. Нет нужды давать clear/close. Это фишка Си++, автоматически сработает деструктор.
    3. Не называйте переменную flag, называйте wasFound (или что она реально значит).
    4. sizeof(&student_r) только чудом совпадает с sizeof(student_r).
    5. Не надо писать flag == false, надо !flag.
    6. Функция del_reversive делает излишнюю работу и переставляет студентов, к тому же есть стандартный алгоритм remove_if.
    7. while (!flag) в del_rev бессмысленно.
    8. Вы же работаете со string’ами — зачем вводить информацию в буфер ограниченной длины?
    9. Программа не модульная, нет нужды в хедере.
    Ответ написан
    Комментировать