Кресты / Говнокод #26580 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
char* szOwnedData = reinterpret_cast <char*> (m_bOwner && szData != NULL ?
                                                              realloc (szData, nLength + 1) :
                                                              malloc (nLength + 1));

Ha ha, classic.

Запостил: codemonkey codemonkey, (Updated )

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

  • Хотел было спросить где тут, но потом вспомнил, что в сях reinterpret_cast нема.
    Ответить
  • Питушня какая-то. Я так и не понял, в чём говнокод. Может, не хватает контекста?

    1. szData и szOwnedData - две разных переменных, после неудачного realloc szData никуда не утечёт.
    2. из условия можно убрать szData != NULL и покормить realloc нулями, но всё равно из-за m_bOwner тернарник никуда не уйдёт.
    3. питушки кукарекают из-за malloc/realloc/free? А какие альтернативы? И какие проблемы, если эта питушня инкапсулирована в классе?
    4. или дело в nLength + 1? Ну то есть szData был nLength, а тут к нему прихерачивают ещё один байт вместо православного увеличения в два раза? Но для того, чтобы это подтвердить, не хватает контекста.

    Вывод: данный кусок - не говно.
    Ответить
    • Питушки кукарекуют из-за того, что смешан C и С++.

      P.S. Какой оналог realloc в плюсах?
      Ответить
      • хороший вопрос. Семантически подойдет кококококпирующий конструктор, но по перформансу будет проеб.

        Типа:

        Petuh petuh = new Petuh;
        ZhirnyPetuh petuh2 = new ZhirnyPetuh(petuh)

        //дисклеймер: я не крестоблядь
        Ответить
        • При чем тут жирный питух? Обычный массив увеличить.
          Ответить
          • Жирный петух это увеличенный обычный питух

            >массив

            а разве не нужно взять list, и list::resize() ?
            Или я пижжу?
            Ответить
            • int* pituh = new int[10];

              Нужно увеличить питуха в 2 раза.
              Ответить
              • но почему массив? почему не list?
                Ответить
                • Во-первых не list, а vector. Во-вторых - захотелось. Вдруг этот укококозатель куда-то в библиотечную функцию передавать?
                  Ответить
                  • я на жабоёбском, извините

                    ну у него же есть ресайз?
                    Ответить
                  • > Вдруг этот укококозатель куда-то в библиотечную функцию передавать?
                    Именно для этого придумали «std::vector::data()».
                    Ответить
                    • Ну может ему насовсем передать надо, а не просто посмотреть. И сишная функция потом free() позовёт.
                      Ответить
                      • >И сишная функция потом free() позовёт.
                        Не ты аллоцировал — не тебе освобождать.
                        Ответить
                        • Да, это самый простой способ не запутаться в собственных соплях. Иначе будут постоянно двойные освобождения и висящие указатели
                          Ответить
                            • Да не только

                              Если есть malloc, значит на том же уровне абстракции должен быть фри.


                              Если есть add, должен быть remove.
                              Если есть шаг -- должен быть след
                              Если есть тьма -- должен быть свет
                              Ответить
                              • Если ты запутался в собственных абстракциях, то ты анскильный питух. Более того, абстракции не нужны.
                                Ответить
                                • Все верно для случая, когда ты в одно лицо пишешь hello world.

                                  А когда

                                  Четыре тысячи петухов
                                  И четыре тысячи индюков

                                  пишут, например, Лиснук, им трудно не создавать абстракций, а не запутываться в них еще сложнее
                                  Ответить
                              • Каждому яблоку — место упасть,
                                Каждому вору — возможность украсть,
                                Каждой собаке — палку и кость,
                                И каждому волку — зубы и злость.

                                #песни
                                Ответить
                            • Лукавый питух и ленивый!

                              Ты освобождал, где не аллочил, и собирал, где не рассыпал; посему надлежало тебе отдать память мою немедля.

                              И я, придя, получил бы моё.

                              Ибо всякому освобождающему дастся и приумножится, а у занимающего отнимется и то, что имеет.

                              А негодному отбросу дайте скриптуху: там будет плач и скрежет зубов.
                              Ответить
                                • Когда же приидет Царь во славе своей и все святые бояре с Ним, тогда сядет на престоле славы своей.

                                  И соберутся пред Ним все кодеры; и отделит одних от других, как пастырь отделяет бояр от скриптухов; и поставит бояр по правую сторону, а биомусор — по левую.

                                  Тогда скажет и тем, которые по левую сторону: идите от Меня, проклятые, в огонь вечный, уготованный скриптухою

                                  Ибо Я был на хабре, и заминусовали Меня; был на ЛОРе, и забанили Меня; был на ГК и смеялись надо Мной; был в блоге, и не посетили Меня.

                                  И сольются сии в хламину вечную, а блаженные праведники в Сишку вечную.

                                  Тогда скажет Царь тем, которые по правую сторону Его: придите, благословенные, наследуйте Царство, уготованное вам от создания Сишки.

                                  И Царь скажет им в ответ: истинно говорю вам: так как вы сделали это одному из сих бояр Моих меньших, то сделали Мне.
                                  Ответить
                                  • Церковная тема - это и так вореции. Ты и с этим умудрился скобенировать. Какой скилл )))
                                    Ответить
      • Я бы использовал сишный realloc + placement new, если это массив какой-то сложной питушни.
        Ответить
      • Да. А ещё проверку на NULL и malloc можно было убрать.

        Например у вектора resize.
        Ответить
        • Вы заебали. Я не про вектор спрашиваю, а как чистый укозатель ресайзнуть!
          Ответить
          • > как чистый укозатель ресайзнуть
            Перейти на другую архитектуру, где указатели шире/уже.
            Ответить
          • В крестах чистые указатели вроде как не приветствуются. Используй готовые контейнеры.

            Да и sizeof(укоззатель) же в конпайл тайме же работает же, как ты ево ресайзнуть собираешься? Регистры программно расширять чтоли умеешь?
            Ответить
            • Ты рофлишь что-ли?
              есть
              pituh1 = (int*)malloc(100500*sizeof(int))
              есть
              pituh2 = new int[100500]
              есть
              realloc(pituh1, 2001000*sizeof(int))
              как c pituh2 сделать?

              Вопрос понятен?
              Ответить
              • Зачем он есть? Зачем? Зачем?

                Почему он не может быть вектором, массивом, строкой и тюпю?
                Ответить
                  • для бобратной совместимости

                    зачем есть char* и string?
                    Ответить
                  • Забудь эту хуйню как страшный сон. Юзай std::array или std::vector.

                    Помнится, в делфи и сибилдере можно было ресайзить массив. И что в итоге? Макаки умудрились нахуевертить Алгоритм Шлемиэля почти в каждой проге. С вектором это сделать сложнее, он не реаллочится на каждый чих.
                    Ответить
                      • Именно поэтому я за подмножество поцкаля, которое преподают в школе.

                        Мы там про демонические массивы ничего не знали, у нас всё сатаничесоке былдо.

                        А ещё нам про джвухмерные матрицы ничего не рассказывали, представляете, как я заебался, когда в первый раз пытался напесать крыстики-нолики?
                        Ответить
                        • меня учили паскалю в доме пионеров, там было про динамичечкую память.
                          Ответить
                    • Блядь, вы как на говнофорумах, когда задаешь вопрос, тебе отвечают какой ты долбоеб, зачем тебе жто нужно.
                      Я теоретическую возможность спрашиваю.
                      Вектор же как-то реаллочит свои кишки внутри?
                      Ответить
                      • Я не знаю его устройства, поэтому попробую угадать.

                        Если делаешь new int[] или malloc, выделяется непрерывный кусок памяти. Если нет свободного места, чтобы его реаллочить на месте, приходится выделять новый кусок памяти, копировать туда все элементы, потом удалять старый кусок.

                        std::vector не обязан размещаться в непрерывном куске памяти. Доступ к его элементам не по сишному указателю с арифметикой, а через перегруженный оператор []. Чтобы реаллочить std::vector, не нужно выполнять пердолинг из предыдущего абзаца, достаточно выделить в произвольном месте памяти блок для новых элементов. Перегруженный оператор [] автоматически направит тебя на старый или на новый блок.

                        Верно или я нафантазировал?
                        Ответить
                        • Не, вектор обязан быть непрерывным. Только дек может юзать блоки.
                          Ответить
                            • Вектор лучше тем, что у него есть разница между size (сконструированными элементами) и capacity (выделенной памятью). Поэтому он может не делать реаллокацию на каждый чих.
                              Ответить
                              • Понял. Вектор выделяет с запасом, у него есть заполненная часть и пустая. Пока в пустой части есть место, можно не реаллочить, поэтому реаллок случается реже.

                                А у new int[] вся выделенная память задействована, поэтому для добавления даже одного элемента нужно делать полный реаллок.
                                Ответить
                        • > не обязан размещаться в непрерывном куске памяти

                          Лол што? Он тоже создаст новый кусок, и удалит старый. Но я думаю он позовёт realloc или его аналог.
                          Ответить
                          • Он не может позвать realloc если тип нетривиален. Для нетривиальных типов он обязан выделить новый буфер, переместить (или скопировать) туда элементы и удалить старый буфер. От realloc'а такие типы может распидорасить.
                            Ответить
                              • Даже читать не буду. Ты там, видимо, перегрузку для тривиально-копируемых типов мне хочешь показать?
                                Ответить
                              • То есть в пике потребление памяти будет OldCapcity + NewCapacity, даже если можно расширить текущий кусок памяти. Крестобляди соснуле.
                                Ответить
                                • > расширить текущий кусок памяти

                                  А это очень редко работает, на самом деле. Особенно в многопоточной проге.

                                  Ну и у вектора есть reserve() если ты примерно знаешь сколько в нём будет элементов и хочешь чтобы он лишний раз не реаллочился.
                                  Ответить
                                  • а если пойти обратным путем - не расширить, а скажем, сузить? М?
                                    Ответить
                                • >То есть в пике потребление памяти будет OldCapcity + NewCapacity
                                  >даже если можно расширить текущий кусок памяти

                                  В других языках типа Йажи, те же проблембы. Разве что gc память дефрагментирует. Но всё равно перепитушня.

                                  > я думаю он позовёт realloc или его аналог.

                                  Вот в С++42 допилят move-семантику моей мечты для нетривиальных конструкторов. И она будет делать realloc, схлопывать new+delete, превращать воду в вино и творить прочие чудеса.
                                  Ответить
                            • Кстати, после перемещения все старые укокококозатели на элементы станут недействительными... Если элементы указывают друг на друга, то указатели может пропатчить функция копирования/перемещения, а с внешними указателями будет какой багор.
                              Ответить
                              • Ну да, итераторы становятся невалидными после push_back() и его друзей.
                                Ответить
                                • даже в жапе нельзя менять объект, по которому ты итерируешься (кроме как через итератор), иначе лапатнешь КонкаррентМудификейшен
                                  Ответить
                            • А как-нибудь можно расширить блок, е сли за ним свободоместо имеется? Или с нетривиальными типами он всегде купировать будет?
                              Ответить
                            • Можно двухэтапный realloc
                              1. выделить новый кусок
                              2. если новый кусок выделен (не NULL) и не равен старому (расширение), удалить старый

                              Тогда между этими этапами в случае, если новый кусок выделен и не равен старому, можно использовать placement питушню. И всё как надо будет.
                              Ответить
                      • > реаллочит свои кишки

                        Вектор всё равно не смог бы юзать такой массив в качестве бекенда. Ему ещё capacity надо, а не только size. Так что это просто бесполезный атавизм от первых версий крестов.
                        Ответить
                      • > на говнофорумах

                        Ну а что ещё сказать, если это ненужный атавизм от первых версий крестов, у которых ещё вектора не было?
                        Ответить
                      • У него там другой виктор, попримитивнее.

                        ЗЫ. Ты мудак, зачем тебе это нужно. Зачем? Зачем?
                        Ответить
                    • Макаки создавали массив размером 1, и пхали туда в цыкле тыщу элементов?

                      умнички какие.

                      У жабоебов тоже есть лист, и он тоже аллокейтится с запасом именно от таких вот долбоёбов
                      Ответить
                      • Ну да, я даже сам так делал пока не заметил как это лагает.
                        Ответить
                        • а добавлял новые элементы ты в начало массива, я надеюсь?
                          Ответить
    • Явное выделение памяти в коде на «C++» в 95% случаях — говно.
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8