Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > GNU toolchain > статические переменные |
Автор: mes 17.6.2008, 11:36 | ||||
недавно столкнулся с одной загадкой в двух проявлениях : 1.
2.
Обе описанные ситуации были получены на компиляторе MinGW (других не пробовал) но установленные на разных компах давали разные результаты (скачивались с одного и того же сайта но в разное время - так что вполне могут быть разные по обновлению) Вопрос: как тогда правильно использовать функции возврашаюшиее ссылки на статические обьекты, чтоб избежать такого непредсказуемого поведения Заранее спасибо. |
Автор: Alek86 17.6.2008, 11:50 | ||
есди этот код был в ашнике, то можент быть, создавались 2 реализацции функции GetWMap, и, соответственно, 2 статические переменные? |
Автор: Lazin 17.6.2008, 12:08 | ||
я понял что имеет место что-то вроде этого ![]()
ошибка может возникнуть из-за того, что порядок создания переменных не определен, если сначала создан объект form, потом static_a, ну а потом static B b;, то удаляться они будут в обратном порядке.. |
Автор: mes 17.6.2008, 12:31 | ||||||||
нет.. двух перемнных не создавалось - возврашалась невалидная ссылка
нет.. открытых ( не обернутых в функцию) не было весь код выглядит примерно так:
Добавлено @ 12:32 названния функций условны.. но места вызовов сохранены |
Автор: Alek86 17.6.2008, 12:35 |
я только предположил, ибо не знаю к примеру из-за того, что каждый cpp компилится в свой obj а как поступает компилер, когда видит код одной и той же функции в 2х cpp (и видит ли вообще) я не знаю. а может это вообще проблемы линковщика, подставить один и тот же адрес в 2 obj при их обработке |
Автор: Lazin 17.6.2008, 12:41 |
возможно нет такого ключа... вот и вылетает может сделать WMap членом класса? |
Автор: UnrealMan 17.6.2008, 12:42 | ||
Это inline-функция, с ней должен разобраться линкер - он оставит только одну функцию, которая во всех единицах трансляции будет одной и той же. Но, в принципе, тут могут быть косяки, можно попробовать пересобрать весь проект. |
Автор: Lazin 17.6.2008, 12:44 | ||
видимо вылитает при завершении программы, если да, то возможно из-за того, что статический объект уже уничтожен... в этом случае поможет синглтон... |
Автор: UnrealMan 17.6.2008, 12:45 |
Ну, а вообще, конечно, следует использовать логи. Тогда можно быстро посмотреть, какие деструкторы когда вызываются. Добавлено @ 12:46 Не всякий синглтон одинаково полезен. |
Автор: Lazin 17.6.2008, 12:50 |
использование одной статической переменной в деструкторе другой статической переменной ни разу не полезно ![]() |
Автор: mes 17.6.2008, 12:53 | ||||
так в чем различие между
|
Автор: Lazin 17.6.2008, 12:55 |
mes, поставь в деструктор класса A брейкпоинт и проверь, кто раньше удаляется... |
Автор: UnrealMan 17.6.2008, 12:56 | ||
У паттерна "синглтон" много реализаций. Синглтон Мейерса базируется на тех же статических переменных, и проблемы у него будут те же самые ![]() |
Автор: mes 17.6.2008, 12:56 | ||
само окно не является глобальным обэектом |
Автор: Lazin 17.6.2008, 12:58 | ||||||||
|
Автор: DRUID3 17.6.2008, 12:58 | ||
??? это как??? ![]() |
Автор: Lazin 17.6.2008, 12:59 |
разница в управлении временем жизни Добавлено через 1 минуту и 28 секунд из твоего кода, это было непонятно. |
Автор: UnrealMan 17.6.2008, 13:06 |
Lazin, а кто будет вызывать delete? ![]() Что именно? Косяки с линковкой? Например, из-за путаницы с датировкой исходников. Может получиться так, что модифицированный исходник, который должен быть перекомпилирован, воспринимается как немодифицированный и в результате получаются не очень хорошие вещи. |
Автор: Lazin 17.6.2008, 13:07 | ||
а никто ![]() Добавлено @ 13:20 можно еще сделать объект общим...
но это все уже из области домыслов ![]() |
Автор: mes 17.6.2008, 13:48 |
Попробую собрать картину воедино: проблема 1 : возникала из за неопределенного порядка удаления статических объектов.. точнее из за того что деструктор формы вызывался за пределами main. проблема 2: появлась " благодаря " недосмотру линкеру при использовании слова inline ситуация имела повторение на другом участке кода (с другой стат. переменной) за активную помошь приведшую к пониманию и решению проблемы +1, для активных участников всем спасибо )) |
Автор: mes 20.6.2008, 18:01 | ||||
решил перечитать тему и наткнулся на этот код - объясните, пожалуйста, с какой такой стати класс приведенный выше является синглетном?? |
Автор: Lazin 23.6.2008, 10:36 | ||||
ну это просто создание экземпляра объекта по требованию
но вообще это написано в спешке и на коленке)) |