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

    +151

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    void f_ai(intrusive_ptr<serial> i);
    //...
    static serial ai;
    serial* ii=&ai;
    //...
    f_ai(ii);

    Компилируется, а потом грохается. С++ такой Си...

    Запостил: CKrestKrestGovno, 25 Сентября 2011

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

    • > f_ai
      что-то это мне кажется знакомым...
      Ответить
    • Какие же всё таки c && c++ непонятные, без чтения манов или полбутылки не разобраться. Я понял сдесь только отдельные слова, но ни черта не понял в целом. Переведите, плз :)
      Ответить
    • >Компилируется, а потом грохается.
      Компилируемость программы не говорит о её работоспособности.
      Ответить
      • Тото и говно. В языке и в коде.
        Ответить
        • Тото, Веснушка, Хоха и говно.
          Ответить
        • разве может быть какой-либо ЯП виноват в том, что твой моцг отсутствует или атрофировался ввиду его неиспользования?
          Ответить
      • Особенно в КРЕСТОБЛЯДСКОМ КРЕСТОЯЗЫКЕ СИ КРЕСТ КРЕСТ
        Ответить
        • Тарас, а ты крещеный?
          Ответить
          • К сожалению, да.
            Ответить
            • ну, можно наверное отречься, принять ислам например ...
              Ответить
              • САМ ПРИМИ ИСЛАМ МУДИЛО
                Ответить
                • чо так разорался-то? если крест давит - сними.
                  Ответить
                  • Да я снял, а он всё равно давит.
                    Ответить
                    • Так это голова твоя дурная давит.
                      А что ты имеешь против ислама?
                      Ответить
                      • Ислам говно, гаремы говно. Бордель - намного более продвинутая в социальном плане вещь, чем гарем.
                        Ответить
                        • >Ислам говно
                          И C тоже:
                          http://oneislam.ru/wp-content/plugins/dynpicwatermark/DynPicWaterMark_ImageViewer.php?path=2011/08/5846.jpg
                          Ответить
                  • Может ещё и трусы надеть?
                    Ответить
                • а что с исламом не так? как по мне, это лучше чем продажное православие и католичество.
                  Ответить
                  • Ислам говно, мусульмане долбоёбы. Я бы вообще запретил ислам в России, потому что экстремистская религия.
                    Ответить
                    • тогда только один путь - в язычники
                      Ответить
                    • все правильно. я точно такого де мнения о православии.
                      Ответить
                      • Все религии говно, надо быть атеистом или Родновером.
                        Ответить
                        • Жаль только, что славянская мифология не дошла до ХХИ века, приходится верить на слово первоисточникам
                          Ответить
                          • Анектод.
                            Сидят на 17 съезде КПСС старпёры, и значит, главный старпёр читает по бумажке:
                            "Товаращи, я, от имени и по поручению, по заданию Партии, приехал на хуй... кхм".
                            Шёпот в зале - "а я же говорил, что не надо было число 17 писать римскими цифрами!"
                            Ответить
            • а почему к сожалению?
              Ответить
              • Похоже что Тарас ненавистник крестов во всех проявлениях, даже в крестики-нолики играет только нулями.
                Ответить
        • Javу никогда попробовать не хотелось?
          Ответить
          • Не. Это ж я не смогу программы всем раздавать, каждому объяснять придётся "вы типа не скачали приблуду на 20 мегов, жабий автомобиль называется".
            Ответить
    • Как-бы ошибка на невнимательность. Знаешь, что функция принимает указатель, но не помнишь какой. Думаешь, что обычный и передаёшь. Тот же shared_ptr такие глупые ошибки пресекает. А в BOOST::intrusive_ptr закралась ошибка. Забыли добавить explicit в конструктор. Говно в данном случае в бусте. Надо писать багрепорт.
      Ответить
      • Нехрен просто использовать указатели с подсчётом ссылок для объектов, которые могут существовать не в куче. Думать надо немножко, прежде чем такое делать. А ещё лучше - сразу закрывать конструкторы от чьих попало грязных рук - во избежание....

        Короче, ошибка здесь не в бусте, а в ДНК автора.
        Ответить
        • Да-да-да, во всех косяках и граблях С++ виноваты авторы кодов, которые не прочитали всего лишь 10 томов умных книг "как НЕ надо писать на С++" и не выучили их наизусть.
          Ответить
          • Чтобы научиться думать, не обязательно учить наизусть 10 томов. Для начала нужно этого просто захотеть.
            Ответить
            • показать все, что скрытоЧтобы писать на С++, надо не уметь думать. Надо уметь зубрить 100500 крестоправил и 100500 крестоисключений из этих крестоправил. В этом плане С++ ничуть не лучше, чем ПХП. Хорошая крестоблядь - это скорее не хороший программист, а хороший ботан-зубрилка.
              Ответить
              • Конечно-конечно, ты-то лучше всех это знаешь. :)
                Ответить
                • Нет, я этих тонкостей и исключений не знаю, не учил и ваще.
                  Ответить
              • На всякий случай напомню, что здесь речь идёт уже не о правилах языка, а о правилах использования конкретной сторонней библиотеки. Активно пользоваться библиотекой, толком не представляя, как она работает и почему именно так - несомненно, признак очень хорошего программиста.
                Ответить
            • >не обязательно учить наизусть 10 томов.
              Вы так говорите, как-будто чтобы научится писать на С++ - необходимо в течении 10 лет набить 100500 шишек, а только потом ты станешь писать нормально. Работодатели такого не любят.
              Ответить
              • Надо полагать, работодатели любят нубов?

                Насчёт 10 лет - сроки, конечно, индивидуальны. Однако если есть голова и желание учиться, ничего лучшего, чем толковый лид, ещё не придумали. Т.к. можно 10 лет набивать шишки самостоятельно, потом 2 года набивать их же на продакшене, а потом за 1 научиться большему, чем за прошлые 12. Проверено.
                Ответить
                • >а потом за 1 научиться большему, чем за прошлые 12. Проверено.
                  На собственном опыте? 13 лет? ох, лол?
                  Ответить
                  • Ну первая стадия (т.е. с того момента, как отец заставил меня забыть про MSX Basic/GW Basic/QBasic и заняться C, а потом и C++) продлилась подольше 10 лет, конечно... точно не засекал. Профессионально программирую (работу работаю, проще говоря) около 4 лет.
                    Ответить
                    • Хороший у вас отец. )
                      Ответить
                    • > отец заставил меня забыть про MSX Basic/GW Basic/QBasic и заняться C
                      надо же, а мой меня научил zx basic'у
                      Ответить
                      • MSX Basic круче всего - у него есть встроенная поддержка хардварных спрайтов. А в C++ нету. :(
                        Ответить
                        • в глаза не видел. а на кубасике я только школьный проект написал - программу, которая от введенной функции (выражения) выдает производную функцию... за одну ночь %)
                          Ответить
                          • Та ну, целая ночь... за ночь я как-то в универе весь курс философии перед экзаменом выучил. А тут какая-то производная.
                            Ответить
                            • За целую ночь можно свою философию создать ... а тут всего лишь выучил.
                              Ответить
                              • свою - ой ли? все придумано задолго до нас...
                                Ответить
                                • упс. нечайно по минусу попал...(
                                  Ответить
                                • Не было бы тогда учёных, добивающихся результатов. Вы же не скажите, что они все переизобретают колёса?
                                  Ответить
                                  • Тут немного другой вопрос, потому что эти результаты узкоспециализированы из появляющихся возможностей, девайсов и т.д.
                                    А такое "всеобъемлющее" понятие, как целая философия - при многовековых попытках философов трудно создать что-то действительно непохожее.

                                    Вот, например, давайте я попробую:
                                    Я считаю, что всё сущее (всё, что вполне может существовать, но не встречалось) существует реально. И, к примеру, привидения и русалки тоже.
                                    Также я уверен, что каждый индивид прав во всём, при этом создавая(или, точнее, "прикасаясь") со своим вариантом сущего.
                                    Например, возьмём тот же древний спор о религиях, или проще: есть ли Бог или же Его нет. Так вот, кто в Него верит, для того на самом деле Он есть, а кто не верит -- никогда не увидит (варианты, зависят от "точек зрения": не узнает, нет вообще, не нужно знать).

                                    То есть, у меня этакая "теория относительности", распространённая не только на материю. Скажите, я ведь повторяю одного или даже нескольких философов?
                                    Ответить
                                    • > То есть, у меня этакая "теория относительности"
                                      дохтур, а вот ко мне давеча стая нейтринов залетела...

                                      солипсизм же!
                                      Ответить
                                      • солипсизм, если его я правильно понимаю, это несколько другое
                                        Ответить
                            • Ну как, окончил универ?
                              Ответить
                          • численное дифференцирование или вы о чем?
                            Ответить
                            • нет, не численное. Вводишь, например, x^2*sin(x), а программа выводит x*(2*sin(x)+x*cos(x)).
                              Ответить
            • >Для начала нужно этого просто захотеть.
              Вам надо написать книгу: "Как выучить С++, лишь захотев, за 1 день."
              Ответить
              • Никто не говорил про 1 день. Кроме того, в первый день буст не проходят.
                Ответить
                • >Никто не говорил про 1 день.
                  Правильно. Чуть выше говорим про 1 ночь :)
                  Ответить
          • Что-то вы вот всё жалуетесь, а я вот 10 томов умных книг по С++ не читал, а с вашими проблемами особо никогда не сталкивался. Видимо, нужно быть криворуким долбоёбом, чтобы иметь проблемы с С++.
            Ответить
            • Значит, и с большим крестокодом не сталкивался. Я вот тоже, но людям верю на слово.
              Ответить
              • Ну, с++ -- мейнстримный язык, разумеется что там довольно много кривонаписанного говна, учитывая, что язык не нянька вроде Дельфи или Басика, и не вытирает бережливо каку с попы программиста каждый раз, после того как он пукнет.

                Т.е. я имею, язык сам по себе, в отрыве от долбоёбов, которые пишут в лаба-style, не так уж плох. Успешно использую в своих проектах. Креши и утечки памяти случаются раз в месяц. Дебажу ошибки за пять минут. И т.д.

                Надо смотреть в сторону тулкитов и систем подобных Qt. Стандартная библиотека и boost, имхо, действительно аляповатое overdesigned говно.
                Ответить
                • больше, больше описаний счастливых дней с крестами
                  Ответить
        • >Нехрен просто использовать указатели с подсчётом ссылок для объектов, которые могут существовать не в куче.

          Автор просто не знал, что функция f_ai принимает умный указатель. Эту функцию другой человек написал. Я же говорю, что на самом деле говно в бустеBOOST::intrusive_ptr, тк автор забыл указать одно ключевое слово при его реализации. В том же shared_ptr и прочих этой ошибки нет. Код банально не скомпилируется. Не будет никаких неявных преобразований.

          >Нехрен просто использовать указатели с подсчётом ссылок для объектов, которые могут существовать не в куче.

          Где автор кода использует умные указатели? Автор просто не подозревал, что их использует.
          Ответить
          • > Я же говорю, что на самом деле говно в бустеBOOST::intrusive_ptr,
            > тк автор забыл указать одно ключевое слово при его реализации.

            Если чуточку загуглить, можно легко убедиться в том, что "constructor is implicit by design". (c)

            > Эту функцию другой человек написал.

            > Где автор кода использует умные указатели?
            > Автор просто не подозревал, что их использует.

            Ок, ошибка разработчика интерфейса (т.е. автора другой части кода). Если для объекта используется подсчёт ссылок, объект не должен удаляться никаким другим способом. Если объект не должен удаляться другим способом - нужно позаботиться о том, чтобы этого не случилось. Самый простой и безопасный способ - закрыть объекту конструктор, закрыть копирование и сделать статический метод create, создающий его на куче (и, возможно, сразу оборачивающий в указатель нужного вида). Если всего этого нет - я делаю вывод, что человек, который ввёл в своей интерфейс intrusive_ptr, не умеет им пользоваться.
            Ответить
            • >constructor is implicit by design
              А зачем? Что-бы случайно натыкаться на такие ошибки?

              >Самый простой и безопасный способ - закрыть объекту конструктор, закрыть копирование и сделать статический метод create
              Как видно, объект используется в проекте и при подсчете ссылок и без. Неоправданное ограничение вы предлагаете ввести.
              Ответить
              • > А зачем? Что-бы случайно натыкаться на такие ошибки?

                http://lists.boost.org/Archives/boost/2005/07/90408.php
                Лично мне достаточно этой аргументации + того факта, что при аккуратном использовании это попросту удобнее, чем каждый раз явно прописывать создание объекта intrusive_ptr.

                > Как видно, объект используется в проекте и при подсчете ссылок и без.

                А зачем? Что-бы случайно натыкаться на такие ошибки?(c)
                Без дополнительной информации лично мне это кажется серьёзным просчётом архитектуры. Подобное смешение изначально небезопасно и непрозрачно (что и приводит к таким вот случайным удалениям статического объекта). И то, что оно чуть менее опасно, чем при использовании shared_ptr, этого факта не меняет. Я бы перед принятием подобного решения десять раз подумал. Наверняка можно найти более удачный выход.
                Ответить
                • >И то, что оно чуть менее опасно, чем при использовании shared_ptr,
                  Ну сшаред_птром так ошибиться просто не возможно. Так что не чуть менее опасно, а безопасно. Возможно ошибится, только по полному не знанию принципов работы shared_ptr. А тут реально серьёзный парень допустил такую ошибку просто по не внимательности, а не из-за незнания. Хотя может архитектуру и стоило пересмотреть. Не спорю. Но архитектуру то он не сам разрабатывал, а просто поддерживал старый код. Хорошо, что хоть ошибка обнаружилась сразу.
                  Ответить
                  • Серьёзного парня давно уже никто ни в чём не обвиняет. :) Просто корень зла здесь всё-таки далеко не в том, что у intrusive_ptr при всех его прочих преимуществах конструктор сделан неявным.

                    С шаред_птром при малейшем усложнении ситуации может вылезти куча другого геморроя, тянущего за собой всяческие shared_from_this и прочие извращения, которые интрузиву просто не нужны. Не говоря уже о том, что у shared_ptr гораздо больше оверхеда...

                    Правда, в отличие от интрузива, для него реализованы слабые указатели. Вот здесь я уже не согласен с бустовцами, считающими, что они не нужны и "не имеют смысла". Однако написать их вручную, несмотря на все их умные протесты, на практике оказалось вполне подъёмной задачей.
                    Ответить
                    • >С шаред_птром при малейшем усложнении ситуации может вылезти куча другого геморроя, тянущего за собой всяческие shared_from_this и прочие извращения

                      Можно несколько примеров?
                      Будут ли эти извращения при использовании intrusive_ptr?



                      >корень зла здесь всё-таки далеко не в том, что у intrusive_ptr конструктор сделан неявным

                      А в чем корень зла?



                      >Однако написать их вручную

                      Простите, не понял. Написать что и кем?
                      Ответить
                      • > Можно несколько примеров?
                        Ничего очень конкретного сейчас уже не дам, т.к. довольно давно почти не пользуюсь shared_ptr. Но гипотетический пример достаточно прост: допустим, у вас есть некий общий ресурс, с которым совершенно независимо друг от друга работают два (или больше) пользователя. Ресурс должен быть удалён, когда все они закончат с ним работать (т.е. счётчик ссылок обнулится). Предположим, один пользователь, хранящий в себе shared_ptr на ресурс, у вас уже где-то есть (или может быть), но где и какой именно - прямо сейчас неизвестно (или просто нет к нему доступа из нужной точки к коде). Как вы собираетесь корректно передать ещё один такой shared_ptr следующему пользователю? Правильно, наследуем ресурс от enable_shared_from_this, вызываем shared_from_this()... ну не извращение ли?

                        > Будут ли эти извращения при использовании intrusive_ptr?

                        Не будут. Т.к. в описанном выше примере счётчик ссылок один и хранится в самом ресурсе. Поэтому можно независимо создавать intrusive_ptr из одного и того же простого указателя хоть тыщу раз в разных местах, не заботясь о том, кто и где на него уже ссылается: пока объект существует - это безопасно. И, кстати, в отличие от shared_ptr, никогда не выделяет динамически дополнительную память под счётчик.

                        > А в чем корень зла?
                        В архитектуре, позволяющей и поощряющей использование объекта, содержащего внутри себя счётчик ссылок, так, как будто этого счётчика в нём нет и им никто не пользуется.

                        > Простите, не понял. Написать что и кем?
                        Что - слабые указатели, успешно работающие в паре с intrusive_ptr.
                        Кем - собой. :)
                        Ответить
                        • >давно почти не пользуюсь shared_ptr
                          А чем пользуетесь? Видимо, intrusive_ptr ?
                          Ответить
                          • Интрузивом и пользуюсь для разделяемых ресуров, причём весьма активно. shared_ptr/shared_array - только для редких крайних случаев, когда нужно "делиться" чем-нибудь типа массива char или std::vector<char> (т.е. объект не является классом, либо у меня нет доступа к его коду).
                            Ответить
                          • Ах да, ещё shared_ptr можно использовать в качестве "keep-alive" для какого-нибудь списка, чтобы избежать его потенциального удаления во время обхода его элементов с вызовом каких-нибудь "опасных" обработчиков. Но это я бы тоже отнёс к извращениям, которых лучше избегать, пока это возможно.
                            Ответить
                      • P.S. Если немного вдуматься, то нетрудно заметить, что enable_shared_from_this + shared_from_this() - это по сути своей диковатый костыль, превращающий shared_ptr в нечто, функционально идентичное intrusive_ptr, однако менее удобное и эффективное.
                        Ответить
                        • Мне тут на тему STL старую шутку в аську скинули:
                          [не аргумент]"Умным может быть кто-то один - либо указатель, либо программист".
                          [/не аргумент]
                          Ответить
                    • >написать их вручную, несмотря на все их умные протесты
                      А что-за протесты?
                      Ответить
                      • Основной аргумент, который мне повсеместно встречается - если счётчик лежит внутри объекта, то якобы невозможно безопасно получить к нему доступ после удаления объекта, чтобы узнать, удалён он уже или нет.

                        Явный вызов деструктора без delete (до обнуления счётчика слабых ссылок), видимо, религия не позволяет.
                        Ответить
                        • Спасибо за интересную беседу. =)
                          Ответить
                          • На здоровье (=
                            Ответить
                            • Кстати, я тоже думаю, что если язык, на котором пишешь - читаемый, но лаконичный, но мощный, то и здоровья больше будет. =)

                              Тк за работой меньше просидишь и займешься спортом, ибо все уже сделал, или сделаешь очень много проектов, успев заработать на дорогие лекарства. (:
                              Ответить
                              • >сделаешь очень много проектов, успев заработать на дорогие лекарства. (:
                                оптимистично
                                Ответить
    • Деточка, это Си [++], здесь нужно думать, когда код пишешь.
      Ответить
      • дауж, тут принцип "пишем хуйню, рантайм покажет" очень болезнен
        Ответить
      • Особенно когда пишешь код с использованием буста.
        Правило простое: пока не понимаешь - не трогай. Умнее от этого не покажешься.
        Ответить
        • По этому правилу писать на С++ не надо никому.
          Ответить
          • У себя в каморке в учебно-экспериментальных целях, невидимо для остальных - хоть сто порций. Снаружи - только после достижения просветления.
            Ответить
        • Автор хорошо знал буст и С++, кстати.
          Ответить
          • См. выше. Проблема, судя по всему, в совсем другом авторе...
            Ответить
      • Мышление тут не причём. Это банальная не внимательность. В отличии от Си - в С++ очень много неявных моментов, на которых можно проколоться, не заметив, как это получилось с говноавтором говнокода.
        Ответить
    • Единственная неинтутивная/плохо реализованная хрень в С++, как по мне -- это отсутствие constructor chaining и сопутствующие симптомы типа ни-ни виртуальным методам в конструкторе.

      В остальном С++ чрезвычайно прозрачен, интуитивен и прост для меня (если не обращать внимание на синтетические примеры), и я не искренне не понимаю всего ажиотажа насчёт его необычайной сложности и запутанности.

      Я, кстати, с бейсика начинал. Так что, не в языке дело, а в голове.
      Ответить

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