Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Запись и извлечение данных в несколько запусков программы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Неточность в понимании условия задачи "Жук" (acmp) http://www.cyberforum.ru/cpp-beginners/thread930617.html
Жук (Время: 1 сек. Память: 16 Мб Сложность: 30%) Петя нашел в Интернете по адресу http://buglab.ru игру-головоломку "Жук", в которой от участников требуется построить для жука лабиринт таким...
C++ Логика switch Программа должна расчитывать количество проданного товара, суть проблемы, кода вместо численных значений в вариантах case я использую буквенные значения названий товара, то все идет по логике... http://www.cyberforum.ru/cpp-beginners/thread930602.html
Мини-брутфорс C++
Задан паттерн XXyyX, где Х может принимать следующие значения: D,J,K,L,L,X,Z, а Y - f,n,s. Необходимо найти все возможные комбинации, при этом символы не должны повторяться, кроме L, так как он...
Структуры. Объединения. Битовые поля C++
Помогите с двумя простенькими программами. Требования: - не использовать шаблоны; - интерфейс должен разработан для неопытного пользователя; - размерность массива - неопределенная; - не...
C++ Си: Выдать слова текста и их длины, Сформировать новую строку по правилу http://www.cyberforum.ru/cpp-beginners/thread930563.html
Задание: Задан некоторый текст, состоящий из слов. Словом считать последовательность символов, не содержащую пробел или другие знаки препинания. Предложения заканчиваются точкой. Длина текста не...
C++ Вместо результата выводит непонятное число Сделал программу которая должна высчитывать по формуле, но она высчитывает не совсем то число. int chislo = Convert::ToInt32(textBox2->Text); int *chisla = new int; int lolx =... подробнее

Показать сообщение отдельно
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
30.07.2013, 02:54  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня код работает.
Оно должно работать, может не понятно описал:
Во время 1-го запуска: добавляем данные о сотрудниках(сохраняются в хипе), можем для проверки вывести данные на экран, далее записываем их в файл и закрываем программу;
Во время 2-го запуска: извлекаем данные из файла и пытаемся вывести их на экран и в этот момент происходит ошибка

Добавлено через 6 минут
Цитата Сообщение от Fyret Посмотреть сообщение
В приведенном коде имеем дело с полиморфными классами, а представление объектов таких классов в памяти начинается с указателя на таблицу виртуальных функций.

Соответственно, когда экземпляр класса сериализуется в файл, туда записывается и этот указатель (строка 159). А когда идет десериализация объектов при другом запуске (это важно), уже созданные (строки 185, 189, 193) объекты (т.е. у них есть свои указатели на таблицу виртуальных функций) полностью перезаписываются. И вместо валидных указателей получают бессмыслицу. Что делает невозможным в данном случае RTTI и приводит к крашу при вызове typeid.

Небольшой хак в функции employee::read() лечит это поведение:
C++
1
2
3
4
        //inf.read((char*)arrap[n], size);
        long long tmp;
        inf.read( reinterpret_cast<char*>(&tmp), sizeof(void*) );
        inf.read( reinterpret_cast<char*>(arrap[n])+sizeof(void*), size-sizeof(void*));
Кстати, в линуксе оригинальная программа при повторном запуске ведет себя корректно, а после пересборки - падает, как в винде. Уверен, это связано с разными подходами к управлению памятью в этих системах. Линукс при втором запуске умудряется выделять процессу ту же память, что и при первом.
Уже поздно, буду тупить при попытке понять смысл хака +sizeof(void*) -sizeof(void*), утром проверю его) Просьба написать еще ссылку на источник где подробней описана суть данного метода. Стоит Windows 7, Visual Studio 2012
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru