1. C++ / Говнокод #15263

    +36

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    #include <iostream>
    
    class StaticClassData {
      int *pointer, value;
    
    public:
      StaticClassData(): pointer(&value) {}
      
      void add(int i) {
        std::cout << "Hello, this is " << this << std::endl;
        value = i;
        std::cout << "I'm fine" << std::endl;
        *pointer = i;
        std::cout << "You never read this text" << std::endl;
      }
    };
    
    class SomeClass {
      struct StaticConstructor {
        StaticConstructor(){ storage.add(1); }
      };
      
      static StaticConstructor constructor;
      static StaticClassData storage;
    };
    
    SomeClass::StaticConstructor SomeClass::constructor;
    StaticClassData SomeClass::storage;
    
    int main(){}

    Долго думал, с какого хрена программа падает на заполнении static поля в "статическом конструкторе". Поле вроде бы есть, но толку от этого мало.
    http://ideone.com/Ux14ep - из раздела ub.govnokod.ru или как выстрелить себе в ногу до выполнения main.

    Запостил: 1024--, 01 Марта 2014

    Комментарии (9) RSS

    • Ответить
    • показать все, что скрытоДайте угадаю, сишкобляди соснули?
      Ответить
      • Нет. Они смотрят со стороны и смеются над крестопроблемами.
        Кстати, в итоге, удалось это всё запустить http://ideone.com/UxbQcu
        Ответить
        • Но лучше так не делать :) Хоть стандарт и утверждает, что Objects with static storage duration defined in namespace scope in the same translation unit and dynamically initialized shall be initialized in the order in which their definition appears in the translation unit.
          Ответить
          • Что интересно, я уже так делал, но по счастливой случайности упоминал поля в правильном порядке, ввиду внешней декларативности записи не думая о столь серьёзных последствиях.
            Ответить
        • Не правильнее ли избавиться от второго статического поля? http://ideone.com/zTB8Up
          Ответить
          • По-хорошему, надо бы переписать куски с подобным кодом на "монопольное" решение.
            Кстати, Вы создали указатель по какой-то важной причине, или просто так?
            Вариант с просто полем http://ideone.com/g885dC мне кажется более уместным и чуть более быстрым.
            Ответить
    • > или как выстрелить себе в ногу до выполнения main.

      это еще что. первая С++ прога которую мне надо было "поднять" еще в добавок и потоки стартовала до main()а. и это было во времена когда отладчики еще абы как С++ поддерживали: загружаешь прогу, а отладчик тебе "программа неожиданно завершилась". потому что уже во время загрузки пытались брякпоинт в main() поставить. (gdb + gcc 2.95/3.х + линух, образца ~2001 года.)
      Ответить

    Добавить комментарий