Как стать автором
Обновить

Комментарии 6

статические переменные класса не будут инициализироваться до первого вызова инстанса этого класса или первого обращения к статической переменной, как и в яве (КО не ошибался)

неправда.
также статика будет инициализирована при любом упоминании класса.
Просто напишите MyClass; и его статика проинитится.
Порядок статик инита переменных не определён стандартом и опираться на него нельзя. Гораздо лучше всю статик инициализацию сложить в отдельный метов, я его так и называю cinit. И вызвать его просто в классе. Это нормально компилится и исполняется. В тот самый статик инит и запишется. только порядком уже вы управляете явно. И вообще зависимости на статиках зло.

А ещё если во время статик инита кинуть эксепнш и поймать снаружи первого упоминания то класс не запишется в глобальную таблицу классов и будет MyClass == null. Соответственно попытка конструирования обломится как null(). А ещё перед тем как кинуть эксепшн внутри ссылка на этот же класс хранится в локальном регистре 0, там где обычно this лежит. И ссылку на неиниченный класс можно выбросить наверх. И получить экземпляр несуществующего в общей глобальной таблице классов класса.
Во оказывается даже писал про это. www.flasher.ru/forum/blog.php?b=589 Ещё про нестатические константы тоже фокусы есть. www.flasher.ru/forum/blog.php?b=549
А вообще зря человека минусуете, очень дельные вещи пишет. Много кто на такое нарывался, да не все разобраться хотят.
Вообще в таких делах RABCDASM незаменим.
неправда.
также статика будет инициализирована при любом упоминании класса.
Просто напишите MyClass; и его статика проинитится.


согласен, про это забыл. Сути не меняет: если класс не юзается — то статика не будет проинициализирована.
если класс не юзается — то статика не будет проинициализирована.

А это правильно и нормально. Иначе вообще странно было бы. В каком порядке, как, когда. Да и вообще зачем.
ну я и подписал, что вроде как кеп на это намекал. Просто, если я не ошибаюсь, в С++ статические методы живут, даже если класс не используется.

А вот на чем КО теряется, это: почему же, все-таки, статическая переменная проинициализировалась 2 раза?
Точный диагноз смогу поставить на майских, сейчас нет особо времени разбираться… Надо сначала минимальный пример без флекса собрать, а потом arbcadsm посмотреть, всё станет сразу понятно. Да и у меня есть отладчик флешового ассемблера, проследить можно будет. Я его не зарелизил потому что на больших флешках баги есть, а на маленьких всё ок.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории