![]() |
Модераторы: 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 |
||||||||
|
|||||||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
спасибо за объяснение. Теперь все окончательно понятно.
PS. текст ошибки читал, и недоумевал как сериалиазция узнала что я юзаю сингелтон ))) Это сообщение отредактировал(а) cupper - 13.1.2011, 20:54 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
cupper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
господя сколько же извращений я нетерпелся пока довел это до рабочего состояния. В итоге имею
Шаблонный класс
Для его использование необходим класс предоставляющий открытй статический метод save() реализующий что душе взбредет.
|
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если уж делаете шаблон, то пусть он принимает функциональный объект, который и будет вызывать в деструкторе.. (а может в бусте уже такое и есть..) тогда можно будет прибиндить все что душе угодно ![]() |
||||
|
|||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
вот про это извращение я и говорил ![]() у меня то из класса единственно что можно получить это ссылку на костантный объект (на сингелтон мой). А додумать как ее запихать в shared_ptr и чтоб потом все еще работало... вот это так и не получилось. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и где ж извращение то ?
![]() Добавлено через 7 минут и 8 секунд вот например : http://liveworkspace.org/code/614303e1aa0d...983dbb2014d7245 |
|||
|
||||
cupper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
извращение не в идеи, а в процессе ее реализации ))
но ятаки навоял код
PS. а теперь посмотрб чего предложили вы, и вероятно ужаснусь от того сколько я всего сделал лишнего )) PPS. хмм.... мой мозг наверно сегодня уже совсем не варит, ибо я понимаю что за в примере, но уже не понимаю как его связать со своей задачей. Псукай в итоге мой код уже даже работает, может даже и правильно, но увы, это уже не то чего я хотел изначально :( Вам mes большое спасибо за разъяснение основной ошибки. Яб сам до этого долго еще не додумался бы. Это сообщение отредактировал(а) cupper - 13.1.2011, 23:30 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
cupper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
что за БД ? каким требованиям ? DatabaseHelper содаржит параметры для подключения, адрес, логин, пассовр, название БД, одним сломов настройки, я как раз и хотел иметь возможность харнить эти настройки вне программы ![]() |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
в моем конкретном случае, БД одна и настройки подключения к ней тоже только одни. Вот и решил опробовать паттерн. С лихвой закруткой в виде автосохранения.
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это еще не основание для применения паттерна синглетон.. |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
а это ? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это сойдет ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |