| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > сингелтон, сериализация в деструкторе |
| Автор: cupper 12.1.2011, 22:42 | ||||||||
| делаю вот такую штуку есть класс (сингелтон)
Вот основные методы
при заверншении программы вызывается по средством shared_ptr вызывается деструктор для объекта theSingelton, а в деструкторе вызывается функция для сериализации текущего состояния в файл. При работе программы (а вернее при ее завершении) получаю
ошибку вызывает строка
не врублюсь, в чем ошибка. |
| Автор: cupper 13.1.2011, 09:28 |
| ну о сингелтонах я раньше уже читал. Выбор сингелтона, тут не столько потребность в нем, сколько желание попробовать (ну и цель кажется оправданная, настройки подключения к БД должны быть одни). А вот по поводу деструктора статических переменных, вопсец есть, да я читал что они уничтожаются несколько иным образом чем другие объекты (а именно порядок удаления не определен) но у меня тут это и не важно, яже не делаю акцент на данные из вне. У меня класс получается замкнут в себе. Сам себе десераилзует при первом обращении к сеингелтону, и сам себя сериализует при вызове деструктора. Притом не важно делаю я сериализацию через *this и не статические функции load save, или же я наоборот делаю их статическими и сериализуют через указатель на объект theSingelton. Проблема так и не прояснилась для меня. |
| Автор: mes 13.1.2011, 10:03 | ||
a сериализация разве не "данные из вне" ?
ну так проблема то не с this-ом вашего класса.. а то что он пытается использовать уже разрушенные объекты... перечитайте внимательно текст ошибки.. |
| Автор: cupper 13.1.2011, 12:00 | ||
хм... перед непосредственно сериализацией данные они еще есть, распечатывал, получается что когда процесс передается сериализации то в этот момент данные разрушаются ? А как это можно проверить, и можно ли как то преодолеть эту проблему. А то не хочется выносить сериализацию в отдельный метод и запускать ее ручками при выходе из программы. |
| Автор: mes 13.1.2011, 13:33 | ||
данные чего ? вашего синглетона.. ну так конечно есть.. ибо деструктор еще в действии.. проблема у того, кому Вы эти данные передаете..
ручками не обязательно.. но запускаться она должна при выходе из маин.. а не тогда, когда будет автоматически подчищен весь мусор... сейчас посмотрю, что там у Вас с кодом.. |
| Автор: mes 13.1.2011, 13:57 | ||||
|
| Автор: cupper 13.1.2011, 14:27 | ||||
ну а что ее там запускать будет ? Получается нужно будет ридумать еще какую то конструкцию над сингелтоном который бы в своем деструкте делал сериализацию сингелтона и потом только удалялся бы сингелтон. В голове крутиться идея, в деструкте сингелтона, создатьвать объект-копию уничтожаемого и его уже сериализовать. |
| Автор: mes 13.1.2011, 14:37 | ||||
при чем тут Ваш синглетон ??? с ним все в порядке.. он жив на момент использования... а вот тот, который должен быть исполнить его последнюю волю, к сожалению, уже погиб.. Добавлено через 1 минуту и 44 секунды
еще раз перечитайте внимательно предыдущие посты.. |
| Автор: cupper 13.1.2011, 15:54 | ||
я не могу понять чего вы мне говорите. Скажите прямо. Я дос сих порт так и не понял что вызывает ошибку. |
| Автор: mes 13.1.2011, 15:59 | ||||
есть два статических объекта.. один Ваш, один библиотечный.. Вы в деструкторе Вашего обращаетесь к библиотечному.. но.. библиотечный к тому времени уже уничтожен... Добавлено через 54 секунды а тут разве не прямо ? :
|
| Автор: cupper 13.1.2011, 16:31 | ||
ах тыж еп*ать черт блин заногу дери точно, яж не контролирую процесс удаление, сингелтон удаляется примерно тогда же когда и все другие объекты. Долго так доходило потому что я даже и не подозревал что сам механизм сериализации сам юзает статические объекты. Черт, тогда получается то что я пытался сделать вообще нельзя сделать. Черт я мне так понравилась задумка, авто сериализации :( блин, чеж делать тогда :( |
| Автор: mes 13.1.2011, 17:02 | ||||
скорее просто задумали не то что нужно.. что требуется то в общем (без оглядки на реализацию) ? чтоб сериализовало некую БД по выходу из маин ? можно например так :
|
| Автор: cupper 13.1.2011, 20:10 | ||||
| деструктор auto_saver вызывается при выходе из main. А когда же тогда вызываелся дейструктов в моем коде ? я был уверен что также при выходе из main. Тогда в чем собстно разница ? Или же сдесь игра идет за счет того что создается стековый объект auto_saver деструктор которого вызывается 100% раньше чем для любых статических переменных ? и кстати
вы подразумеваете отказ от сингелтона как такового ? И будет ли разница если сделать так
но все равно не понимаю концептуальной разницы между моим кодом и вашим. Тут и там сериализация происходит в деструкторе. Оба вызываются автоматически. |
| Автор: mes 13.1.2011, 20:33 | ||||||||
нет, в контексте данного вопроса, не отказываю Вам в синглетоне, как таковом а лишь призываю, не использовать в его деструкторе ничего внешнего.. гораздо позже.. во времени жизни.. в случае с автосейвером, он гарантировано уничтожится на выходе из мейн и гарантировано раньше, чем уничтожатся синглетоны статические объекты.. в случае с синглетоном такой гарантии нет..
но в разные моменты времени поэтому я изначально и предложил : но Вы почему то не отказали себе в этом удовольствии а так бы съэкономили время и мне и себе Добавлено через 11 минут и 9 секунд
другие статические объекты и в неопределенном для пользователя порядке..
|
| Автор: cupper 13.1.2011, 20:51 |
| спасибо за объяснение. Теперь все окончательно понятно. PS. текст ошибки читал, и недоумевал как сериалиазция узнала что я юзаю сингелтон ))) |
| Автор: mes 13.1.2011, 21:06 | ||
|
| Автор: cupper 13.1.2011, 21:59 | ||||
| господя сколько же извращений я нетерпелся пока довел это до рабочего состояния. В итоге имею Шаблонный класс
Для его использование необходим класс предоставляющий открытй статический метод save() реализующий что душе взбредет.
|
| Автор: mes 13.1.2011, 22:18 | ||||
если уж делаете шаблон, то пусть он принимает функциональный объект, который и будет вызывать в деструкторе.. (а может в бусте уже такое и есть..) тогда можно будет прибиндить все что душе угодно |
| Автор: cupper 13.1.2011, 22:30 | ||
вот про это извращение я и говорил у меня то из класса единственно что можно получить это ссылку на костантный объект (на сингелтон мой). А додумать как ее запихать в shared_ptr и чтоб потом все еще работало... вот это так и не получилось. |
| Автор: mes 13.1.2011, 22:56 | ||
и где ж извращение то ?
Добавлено через 7 минут и 8 секунд вот например : http://liveworkspace.org/code/614303e1aa0d73cfe983dbb2014d7245 |
| Автор: cupper 13.1.2011, 23:22 | ||||||
| извращение не в идеи, а в процессе ее реализации )) но ятаки навоял код
PS. а теперь посмотрб чего предложили вы, и вероятно ужаснусь от того сколько я всего сделал лишнего )) PPS. хмм.... мой мозг наверно сегодня уже совсем не варит, ибо я понимаю что за в примере, но уже не понимаю как его связать со своей задачей. Псукай в итоге мой код уже даже работает, может даже и правильно, но увы, это уже не то чего я хотел изначально :( Вам mes большое спасибо за разъяснение основной ошибки. Яб сам до этого долго еще не додумался бы. |
| Автор: mes 14.1.2011, 00:00 | ||
а может просто BD не соответствует требованиям ? поэтому и возникают вопросы.. хотя это уже другая тема.. |
| Автор: cupper 14.1.2011, 00:32 | ||||
что за БД ? каким требованиям ? DatabaseHelper содаржит параметры для подключения, адрес, логин, пассовр, название БД, одним сломов настройки, я как раз и хотел иметь возможность харнить эти настройки вне программы |
| Автор: mes 14.1.2011, 00:48 | ||
но вот тогда зачем его делать синглетоном ?! |
| Автор: cupper 14.1.2011, 10:51 |
| в моем конкретном случае, БД одна и настройки подключения к ней тоже только одни. Вот и решил опробовать паттерн. С лихвой закруткой в виде автосохранения. |
| Автор: mes 14.1.2011, 10:59 |
это еще не основание для применения паттерна синглетон.. |
| Автор: cupper 14.1.2011, 16:49 | ||
а это ? |
| Автор: mes 14.1.2011, 17:17 |
это сойдет |