|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.06.2014, 01:26 | #1 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Здравствуйте.
Суть вопроса в том, как обезопасить обращения из конструктора/деструктора деструктора глобальных объектов к стандартным библиотекам Си/Си++. Например, в windows msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx говорят о том, что во время выполнения кон/дес нет гарантий того, что стд библиотеки будут загружены. Неужели нельзя сделать загрузку/выгрузку двухэтапной, сначала загружаем все библиотеки, а потом вызываем конструкторы. В общем в Linuxe это проблема актуальна? Любые полезные ссылки приветствуются. Понял как правильно: Код:
Такой способ поможет в нужное время вызвать конструктор, а с деструктормами проблема не решена. Без правильного порядка выгрузки вопрос не решить. Видимо про беспорядочную загрузку/выгрузку - сказки от MS, во всяком случаи в Linux порядок имеется. Такой тест набросал (текущая директория /usr/local/lib): Код:
.............................->4->5 1->2->3-> .............................->6 #g++ 1.cpp -o lib1.so -fpic -shared #g++ lib1.so 2.cpp -o lib2.so -fpic -shared #g++ lib2.so 3.cpp -o lib3.so -fpic -shared #g++ lib3.so 4.cpp -o lib4.so -fpic -shared #g++ lib4.so 5.cpp -o lib5.so -fpic -shared #g++ lib3.so 6.cpp -o lib6.so -fpic -shared #ldconfig Линкуем все либы с исполняемым файлом: #g++ lib3.so lib1.so lib6.so lib2.so lib5.so lib4.so ex.cpp -o ex #./ex 1::constr 2::constr 3::constr 4::constr 5::constr 6::constr ex::main 6:: destr 5:: destr 4:: destr 3:: destr 2:: destr 1:: destr Во время экспериментов столкнулся со странностью, почему так получается? Код:
#g++ 2.cpp -fpic -shared -o lib2.so #g++ ex.cpp lib1.so lib2.so -o ex #ldconfig #./ex 1::constr 1::constr // Должно быть 2::constr ? ex::main 1:: destr 1:: destr // Должно быть 2:: destr ? Т.е. мы берем две готовы либы.so, линкуем с исполняемым файлом и как-будто одна либа загружается дважды. Мы ведь можем слинковать программу с сторонними библиотеками, никаких гарантий об уникальности имен быть не может, по-моему смахивает на ошибку. Последний раз редактировалось Stilet; 19.06.2014 в 19:18. |
18.06.2014, 10:04 | #2 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Цитата:
Вы путаете порядок загрузки библиотек, что регламентировано, с порядком вызова конструкторов у глобальных объектов, что НЕ регламентировано. Если в каком-то компиляторе/платформе есть что-то, похожее на порядок, то это совпадение, на которое рассчитывать не стоит. Сделайте ОДНУ библиоетку, с тремя файлами - a.c b.c и c.c В каждой сделайте глобальный объект с конструктором. Скомпилируйте программу несколько раз, меняя порядок файлов в командной строке. Уверен, вас ждет много интересного. Если будете использовать глобальные объекты, вам хотя бы будет гарантирован порядок удаления - он ВСЕГДА строго наоборот созданию. Если будете использовать singleton, тогда либо надо самому создавать и удалять объекты и заботиться о том, чтоб это делалось в правильном порядке, либо порядок удаления объектов вам не гарантируется, если вообще они будут удаляться (если честно - не в курсе, не использую глобальные объекты, чего и вам желаю). Можете сделать ОДИН глобальный объект, у кого будут переменные из нужных классов. |
|
18.06.2014, 10:57 | #3 | ||
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Цитата:
Код:
Цитата:
Последний раз редактировалось Stilet; 19.06.2014 в 19:23. |
||
18.06.2014, 14:05 | #4 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
в анонимные неймспейсы помести свои структуры
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
18.06.2014, 14:14 | #5 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Не понял, пример если можно.
Еще так пробывал: Код:
1::constr ex::main f1 = 1 f2 = 1 1:: destr 1:: destr Пожаловался: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61549 Последний раз редактировалось Stilet; 19.06.2014 в 19:24. |
18.06.2014, 18:35 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Вы бы язык сначала выучили, прежде чем жаловаться.
|
19.06.2014, 04:51 | #7 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Всё waleri, черная метка.
Один вопрос: как в анонимном namespace сделать обыкновенный static член? Т.е. который будет одним для всех экземляров? Код:
Последний раз редактировалось Stilet; 19.06.2014 в 19:25. |
19.06.2014, 18:47 | #8 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
>Один вопрос: как в анонимном namespace сделать обыкновенный static член? Т.е. который будет одним для всех экземляров?
так же, как и в обычном, не анонимном
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
19.06.2014, 19:05 | #9 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Наверное не уточнил: все экземпляры из разных .срр ссылались на одни данные. Т.е. анонимный namespace только для заглушки экспорта из библиотеки. Как обычно пытался, но чего-то не вышло.
|
19.06.2014, 20:13 | #10 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
В целом вроде все ясно. Просто неявное связывание сильно различается у windows и linux. Первое знакомство было с win библиотеками. Мало того что в linux явно об экспорте не надо просить компилятор, так еще и предоставлен механизм подобный виртуальным функциям (догадваюсь об этом). Надо быть внимательным и не забывать про namespace'ы.
Всем спасибо. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как подружить std::map и глобальные объекты | _Bers | Общие вопросы C/C++ | 18 | 28.06.2012 22:52 |
Динамические объекты | 095 | Общие вопросы Delphi | 2 | 04.06.2011 19:09 |
объекты класса и динамические массивы | alex_alpha | Общие вопросы C/C++ | 14 | 11.06.2010 01:32 |
Динамические объекты | 095 | Общие вопросы Delphi | 1 | 04.10.2007 21:16 |