![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Всем привет
Имею следующую проблему: В проекте два cpp-ка. В одном объявлен статический глобальный инстанс класса (объект A) и в другом статический глобальный инстанс другого класса (объект B). Необходимо сделать так, что бы объект A создавался после, а разрушался до B. Пока такое удалось сделать лишь разнесением во времени компиляции двух Cpp-ков, но это оч. ненадежно. Второй вариант проблемы: объект А находиться в dll-ке. Однако после FreeLibrary не уничтожается. А уничтожается уже после объекта B. Может кто знает как быть? |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
К сожалению все достаточно жестко. Исходник, содержащий A, модифицировать нельзя. Так что B получается тоже статическим. (ясно что размещение в куче или на стеке никак здесь не поможет
Может кто то знает, как сдеалать так, что бы после выгрузки dll-ки (второй вариант вопроса) все ее статические объекты сразу уничтожались? |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
не очень ориентируюсь в dll, но если загружать и выгружать dll в одном скопе?
не будет ли глобальная для dll локальной для этого скопа? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Никак. Стандартом не определен порядок конструирования глобальных объектов, а значит и порядок их разрушения (стандарт гарантирует что порядок уничтожения объектов будет обратным порядку их создания). Это так называемая проблема висячих ссылок (dead reference problem). Как вариант, можно не удалять объект В вовсе, если конечно деструктор В не должен обязательно выполнить какой-либо код. Еще с этим борятся с помощью ф-ии atexit. Подробно можно прочитать в книге Александресску - "Современное проектирование на С++" глава Реализация шаблона Singletone.
Когда библиотека загружается статически, все глобальные объекты будут уничтожены до того как она будет выгружена, если с помощью LoadLibrary - не знаю, вообще я предпочитаю, что-бы у dll-ок были ф-ии Initialize, Free =) |
|||
|
||||
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
если подумать, то все ее глобальные переменные обязаня выгрузиться до выгрузки диелелки. иначе в наличии уже не будет кода для деструкторов Добавлено через 39 секунд
оно то хорошо, но
|
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Если FreeLibrary приведет к выгрузке dll, то должен уничтожится. Проблема будет, если dll уже была загружена ДО вызова LoadLibrary - в таком случае FreeLibrary нужно будет вызвать дважды (или более) для того, что бы dll действительно выгрузилась. Второй вариант проблемы - если объект A в dll находится не на глобальном уровне, а вложен в какую нибудь процедуру, в таком случае его конструктор вызывается при первом проходе через место его описания, а деструктор будет вызван из специальной функции, которая регистрируется через atexit вместе с выполнением конструктора (это одна из возможных реализаций). В таком случае при завершении программы вообще может произойти слом, если dll уже будет выгруженна. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |