|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||
Почему глобальный объект, объявленный до main, конструируется в ней?13.09.2011, 17:16. Показов 4435. Ответов 36
Метки нет (Все метки)
Всё просто, имеем код:
Так, открываем прогу в отладчике OllyDbg, стоим на точке входа (у всех своя, у меня) 401220, ставим бряк на 401290, на main, запускаем. Видим, что бряк сработал, но конструктор не вызвался! Чуть пониже в окне дизассембра видим вызов printf с аргументом "konstruktor", то есть объект конструируется в main. Как такое может быть? Компилятор g++. Спасибо, кто откликнется.
0
|
|||||||||||
| 13.09.2011, 17:16 | |
|
Ответы с готовыми решениями:
36
Почему я не могу скрыть глобальный объект document?
Почему ругается на не объявленный идентификатор |
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 13.09.2011, 18:56 [ТС] | |||
|
За printf: как бы не хотелось мне думать, что я просто "не заметил" вызова конструктороа, это не так. Брякаюсь на начало main (первый оператор или как его там), пошаговто трассирую и попадаю на printf с параметром "konstruktor". Так что увы и ах, объект создаётся в maine, что ставит с ног на голову мои и без того шаткие знания. Ребята, может в опциях компилятора надо что поправить? Я щас это смотрю уже.
0
|
|||
|
|
|||||
| 13.09.2011, 19:18 | |||||
|
Добавлено через 1 минуту Т.е. пост #4
0
|
|||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
| 13.09.2011, 19:35 [ТС] | ||||||
|
Всё понятно.
Значит, ещё раз. Чтобы куда-то брякнуться, мне надо цифры какие-то. Адрес то есть. Я его получаю так:
Потом эту прогу открываю в отладчике и ставлю бряк на 401290, думая, что это начало main (естессно, ошибочно, ибо я всегда думаю ошибочно) Ваш вариант нахождения адреса для бряка обрисуйте пожалуйста. (Только пожалуйста не "первый оператор", а то мы с вами так далеко не уйдём.) Добавлено через 1 минуту ...Кстати, пост номер 9 на корню зарубает мою тягу к знаниям.
0
|
||||||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|
| 13.09.2011, 19:43 | |
|
Результаты экспериментов.
Откопал MinGW 3.4.5 и GDB 6.8 В этой связке у меня работает не так, как у ТС. Если установить breakpoint на имя main или на адрес, который выводится потом в printf (это 2 разных места) то в любом случае к моменту остановки слово konstruktor уже выведено. Если смотреть ассемблерный код, то внутри функции main можно увидеть вызов функции __main. Функция __main проверяет, вызывалась ли она уже, и если нет, то вызывает конструкторы глобальных объектов (функция __do_global_ctors). Так что формально, вызов конструкторов возможен уже после входа в main. Но. Первый раз функция __main вызывается на этапе инициализации из функции __mingw_CRTStartup, ещё до вызова функции main Так что в моей версии конструкторы вызываются до main, как и должно быть. Но программисту все эти тонкости всё-равно ни к чему, если всё работает как надо. Кстати, MinGW 4.5.2 строит код точно так же, а вот в Linux/x86_64 GCC 4.5.1 никаких посторонних вызовов внутри функции main не обнаружено.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 13.09.2011, 19:58 [ТС] | ||
|
У меня 3.4.2, можешь скинуть куда-нибудь?
Добавлено через 3 минуты Хотя...
0
|
||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||||
| 13.09.2011, 20:00 | |||||||
|
Кого скинут? 3.4.5, на котором я экспериментировал, входит в стостав wxDev-C++.
Версия 4.5.2 с sourceforge, кажется. У niXman в подписи можно найти 4.6.1 с бустом. То есть я имел в виду команду
0
|
|||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||
| 13.09.2011, 20:20 [ТС] | ||||||||||||
|
А с этим как быть?
А точнее если: что же тогда выводится по
Добавлено через 11 минут Час от часу не легче, оказывается, на main нельзя брать адрес: http://msdn.microsoft.com/ru-r... adt5z.aspx Cannot have its address taken. Но тогда это кое-что проясняет (хотя g++ отношение к мелкомягким не имеет, но тем не менее), а именно: адрес main, полученный программным путём- фуфловый. Значит, может быть действительно, брякаться надо на
0
|
||||||||||||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||||
| 13.09.2011, 20:40 | ||||
|
Добавлено через 5 минут Собственно, разница между этими точками останова только в том, что по символическому имени пропускается настройка стека.
0
|
||||
|
|
||
| 13.09.2011, 21:01 | ||
|
Нечеловеческий способ - это продизассемблировать программу и глазками посмотреть адрес, который будет соответствовать первому оператору (если понимаешь в ассемблере). В режиме с оптимизациями ты этого в принципе уже получить точным образом, потому как компилятор скорее всего коды перемешает и не факт, что в программе найдётся точная граница между тем, как "первый оператор уже выполнен" и "первый оператор ещё не выполнен", потому что это на языке только один оператор, а в коде это будет несколько машинных инструкций, которые могут перемешаться с инструкциями другого оператора
0
|
||
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
||
| 13.09.2011, 21:13 | ||
|
0
|
||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 13.09.2011, 21:27 | ||
|
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 13.09.2011, 21:29 [ТС] | ||
|
...Вообще сказка про белого бычка. Чтобы знать первый оператор функции надо знать где эта функция начинется чтобы посмотреть её первый оператор чтобы посмотреть где она начинается чтобы... Короче, вы не знаете.
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 13.09.2011, 21:39 | |
|
1
|
|
|
|
|||||
| 13.09.2011, 21:55 | |||||
|
Добавлено через 11 минут И ещё::
0
|
|||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 13.09.2011, 22:49 [ТС] | |
|
Да не. Ничё не даст. Опять тягомотину на пустом месте разводить будешь.
Добавлено через 13 минут Короче, и смех и грех. Качнул mingw-get-inst-20100831.exe, так вроде нормально всё, сперва создаёт объекты, потом вызывает main, как и задумано. Так ведь он добавляет в код моей проги загрузку вот этой библиотеки: libgcc_s_dw2-1.dll; он с собой приволок её из интернета. Приходится кидать libgcc_s_dw2-1.dll в одну папку с исходником и наблюдать как предсказуемо работает моя прога, удовольствие малоприятное. Так Этот компилятор что, для всех прог будет требовать наличие libgcc_s_dw2-1.dll? ужасно так-то. Добавлено через 32 минуты grizlik78, спасибо,тебе, дружище! Может теперь буду почаще менять компиляторы, а то у меня аж с 2004-го года стоял. Поковырялся в переменных среды и всё заработало. Так что спишем всё на старость моего компилятора. Щас поставил 4.5.0. До свидания, друзья. До новых встреч!
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 13.09.2011, 22:53 | |
|
kravam, писать программы, поведение которых зависит от компилятора - зло
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 13.09.2011, 22:59 [ТС] | |
|
Да не, поведение не зависело, вы невнимательно читали тему или вообще не читали её. Просто я мысля обнаружил расхождение между теорией и практикой и решил его решить.
0
|
|
| 13.09.2011, 22:59 | |
|
Помогаю со студенческими работами здесь
37
Глобальный объект Глобальный объект Глобальный объект
Глобальный объект Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор под наименованию группы (на. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|