![]() |
|
Модераторы: bsa |
![]()
|
|
| moskitos80 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.8.2012 Репутация: нет Всего: нет |
Здравствуйте. Изучаю С++ по Лафоре. Дошёл до места, где объясняется, как записывать объекты разных классов в один бинарник.
У Лафоре, идея чтения из одного файла, данных объектов разных классов, следующая: перед записью данных объекта записываем его тип, а при чтении - сначала читаем тип, создаём объект нужного класса и читаем в него данные. Там же кстати приводится рабочий(!) пример этого действа. Почитал тему - понял - начал делать самостоятельно: облом, прога вылетает с ошибкой сегментации памяти. В чём дело не могу понять - хоть убейте! Который день ломаю голову. Описание проблемы следующее - есть Базовый класс: Person, и есть 2 его наследника: Student и Employee, а так же есть класс Storage, который должен их сохранять и читать из файла. Так вот, если прога (листинг снизу) отрабатывает одним запуском, т.е. пишет в файл, а потом сразу читает - всё ок! НО, если, закоментировать storage.readAll(); и таким образом сначала только записать данные, а потом закоментировав логику записи, попытаться прочитать записанное, то прога вылетает с ошибкой сегментации. Про POD объекты я немного почитал пока использовал поиск по этому вопросу, и что смущает, так это то что у Лафоре в примере (рабочем!) присутствует и наследование и приватные поля... короче признаки не POD объектов - и всё прекрасно работает без сериализации и boost! В общем дошёл я до того, что начал делать дампы памяти объектов программы, а заодно открыл HEX-редактором получающийся бинарник. И заметил я, что когда в методе storage.readAll() - инициализируется нужный обект: pers1[cnt] = new Student; (я указал в коде) он имеет отличающийся набор байтов от того, который в него считыватся из файла. При этом отличается только первый байт данных объекта! И почему-то всегда на 20(HEX)! Повторюсь, что при запуске программы на чтение и на запись данные при инициализации и те, что в файле абсолютно идентичны. Люди знает кто нибудь что это за фича? Подскажите, скоро дураком стану. Листинг:
|
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Это потому, что когда ты коментируешь часть кода, меняется положение таблицы виртуальных функций в памяти, а первые 4 байта объекта - это указатель на неё.
Нельзя просто так взять и прочитать из файла объекты с виртуальными функциями. Это сообщение отредактировал(а) leniviy - 17.8.2012, 18:53 |
|||
|
||||
| moskitos80 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.8.2012 Репутация: нет Всего: нет |
Ох leniviy - спасибо попробую сделать так что бы не комментировать код. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |