![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
cupper |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
делаю вот такую штуку
есть класс (сингелтон)
Вот основные методы
при заверншении программы вызывается по средством shared_ptr вызывается деструктор для объекта theSingelton, а в деструкторе вызывается функция для сериализации текущего состояния в файл. При работе программы (а вернее при ее завершении) получаю
ошибку вызывает строка
не врублюсь, в чем ошибка. Это сообщение отредактировал(а) cupper - 12.1.2011, 22:43 |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
код не смотрел.. но, мне кажется, Вам не помешает погуглить на темы : недостатки синглетонов и чем опасны деструкторы статических переменных.. |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
ну о сингелтонах я раньше уже читал. Выбор сингелтона, тут не столько потребность в нем, сколько желание попробовать (ну и цель кажется оправданная, настройки подключения к БД должны быть одни). А вот по поводу деструктора статических переменных, вопсец есть, да я читал что они уничтожаются несколько иным образом чем другие объекты (а именно порядок удаления не определен) но у меня тут это и не важно, яже не делаю акцент на данные из вне. У меня класс получается замкнут в себе. Сам себе десераилзует при первом обращении к сеингелтону, и сам себя сериализует при вызове деструктора.
Притом не важно делаю я сериализацию через *this и не статические функции load save, или же я наоборот делаю их статическими и сериализуют через указатель на объект theSingelton. Проблема так и не прояснилась для меня. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
a сериализация разве не "данные из вне" ? ну так проблема то не с this-ом вашего класса.. а то что он пытается использовать уже разрушенные объекты... перечитайте внимательно текст ошибки.. |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
хм... перед непосредственно сериализацией данные они еще есть, распечатывал, получается что когда процесс передается сериализации то в этот момент данные разрушаются ? А как это можно проверить, и можно ли как то преодолеть эту проблему. А то не хочется выносить сериализацию в отдельный метод и запускать ее ручками при выходе из программы. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
данные чего ? вашего синглетона.. ну так конечно есть.. ибо деструктор еще в действии.. проблема у того, кому Вы эти данные передаете..
ручками не обязательно.. но запускаться она должна при выходе из маин.. а не тогда, когда будет автоматически подчищен весь мусор... сейчас посмотрю, что там у Вас с кодом.. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Это сообщение отредактировал(а) mes - 13.1.2011, 13:58 |
||||
|
|||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
ну а что ее там запускать будет ? Получается нужно будет ридумать еще какую то конструкцию над сингелтоном который бы в своем деструкте делал сериализацию сингелтона и потом только удалялся бы сингелтон. В голове крутиться идея, в деструкте сингелтона, создатьвать объект-копию уничтожаемого и его уже сериализовать. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при чем тут Ваш синглетон ??? с ним все в порядке.. он жив на момент использования... а вот тот, который должен быть исполнить его последнюю волю, к сожалению, уже погиб.. Добавлено через 1 минуту и 44 секунды
еще раз перечитайте внимательно предыдущие посты.. |
||||
|
|||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
я не могу понять чего вы мне говорите. Скажите прямо. Я дос сих порт так и не понял что вызывает ошибку. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
есть два статических объекта.. один Ваш, один библиотечный.. Вы в деструкторе Вашего обращаетесь к библиотечному.. но.. библиотечный к тому времени уже уничтожен... Добавлено через 54 секунды а тут разве не прямо ? :
|
||||
|
|||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
ах тыж еп*ать черт блин заногу дери ![]() точно, яж не контролирую процесс удаление, сингелтон удаляется примерно тогда же когда и все другие объекты. Долго так доходило потому что я даже и не подозревал что сам механизм сериализации сам юзает статические объекты. Черт, тогда получается то что я пытался сделать вообще нельзя сделать. Черт я мне так понравилась задумка, авто сериализации :( блин, чеж делать тогда :( |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
скорее просто задумали не то что нужно.. ![]() что требуется то в общем (без оглядки на реализацию) ? чтоб сериализовало некую БД по выходу из маин ? можно например так :
Это сообщение отредактировал(а) mes - 13.1.2011, 17:05 |
||||
|
|||||
cupper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
деструктор auto_saver вызывается при выходе из main. А когда же тогда вызываелся дейструктов в моем коде ? я был уверен что также при выходе из main. Тогда в чем собстно разница ? Или же сдесь игра идет за счет того что создается стековый объект auto_saver деструктор которого вызывается 100% раньше чем для любых статических переменных ?
и кстати
вы подразумеваете отказ от сингелтона как такового ? И будет ли разница если сделать так
но все равно не понимаю концептуальной разницы между моим кодом и вашим. Тут и там сериализация происходит в деструкторе. Оба вызываются автоматически. |
||||
|
|||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет, в контексте данного вопроса, не отказываю Вам в синглетоне, как таковом ![]() а лишь призываю, не использовать в его деструкторе ничего внешнего.. ![]() ![]() гораздо позже.. ![]() во времени жизни.. в случае с автосейвером, он гарантировано уничтожится на выходе из мейн и гарантировано раньше, чем уничтожатся синглетоны статические объекты.. в случае с синглетоном такой гарантии нет..
но в разные моменты времени ![]() поэтому я изначально и предложил : но Вы почему то не отказали себе в этом удовольствии ![]() ![]() а так бы съэкономили время и мне и себе ![]() Добавлено через 11 минут и 9 секунд
другие статические объекты и в неопределенном для пользователя порядке..
![]()
![]() Это сообщение отредактировал(а) mes - 13.1.2011, 20:40 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |