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

    +20

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    Matrix matrix ( h, w );
    delete &h, &w;
    
    for ( int i = 0; i < h; i++ )
    {
        for ( int j = 0; j < w; j++ )
        {
            cout << "Введите элемент [" << i << ", " << j << "]: ";
            cin >> matrix[i][j];
        }
    }

    Найди ошибку...

    Запостил: SkaN, 19 Августа 2013

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

    • > delete &h, &w;
      int h, w; ?
      Ответить
      • Нет, они раннее были определены )) что смешно, я над этой ошибкой бился долго. Пока не заметил, что после удаления переменных я ими пользовался в циклах
        Ответить
        • Эм. Интересно как эти переменные были определены и инициализированы, если юзаются они не как указатели. Как-то так что-ли? :)
          int &x = * new int(5);
          // ... some code ...
          delete &x;
          Если там действительно что-то подобное, то именно это и надо кидать на ГК... Хотя delete &x само по себе достойно отдельного треда ;)
          Ответить
          • Ну это... я пытался их удалить по разному, но только так компилятор не ругался:-( а определены они просто int h, w;
            Ответить
            • Удалять указатели на локальные перменные, переданные по значению, - очень странная затея.
              Подумайте, нужен ли вам C++. Хорошо подумайте.
              Ответить
              • Может быть Вам достаточно мыла и веревки)
                Ответить
              • > Удалять указатели на локальные перменные, переданные по значению, - очень странная затея.

                Ты преувеличиваешь его вину. Он не удалял указатели на локальные переменные. И даже не удалял локальные переменные, размещенные по указателю. Он лишь удалил одну локальную переменную, размещеную по указателю.
                Ответить
                • Но ведь всё равно, вдоль, а не поперёк.
                  Ответить
                • >>удалил одну локальную переменную
                  значит, нужно как-то так
                  http://ideone.com/qQkD8f
                  Ответить
                  • Лучший учиник ОПа (учинил).
                    Переплюнул своего препо давателя.
                    Ответить
          • >>int &x = * new int(5);
            >>то именно это и надо кидать на ГК
            Каюсь, грешен! Огромная структура объявлялась в стеке, который неожиданно кончился.
            Но ведь это же уныло на 95% - чего УГ постить-то?
            Ответить
            • Я вот много раз видел delete &r, где r - ссылка.
              У этого даже был какой-то плюс и он эксплуатировался где-то в коде около вызова конструктора. Я вот забыл. Подумаю - может вспомню и отпишусь.
              Ответить
              • Пока вспомнил у вызова конструктора около new только звездочку int &h = *new
                Ответить
    • так толсто, что толсто
      Ответить
    • delete &h, &w;
      
      for ( int i = 0; i < h; i++ )

      Use-after-free что ли?
      Ответить
      • > Use-after-free что ли?
        Да тут вообще что-то странное и необычное происходит... То ли освобождение автоматической переменной, что маловероятно. То ли указатель на инт (причем, видимо, ради удобства обращения к инту сконверченный в ссылку), необходимость которого тоже трудно объяснить.

        Для полного понимания кода реквестирую у ОП'а описание h и w и их инициализации.
        Ответить
        • Инициализация простая: int h, w; удаляю их так, потому что только так не ругался компилятор. Собственно и все:-) да, я нуб
          Ответить
          • На что он ругался?
            Совсем там накурились?
            Ответить
            • Не помню, на что ругался, потом может воспроизведу
              Ответить
            • Что - то типа "Ты по что переменную обидел, смерд?!"
              Ответить
            • main.cpp: In function ‘int main(int, char**)’:
              main.cpp:34:12: error: type ‘int’ argument given to ‘delete’, expected pointer
              delete h, w;

              нате!
              Ответить
              • Кто ж тебе сказал, что нужно delete переменные, объявленные просто так в стеке?
                Найди его и ударь ему в бубен!
                А если сам придумал, то бросай С++ и иди в гуманитарное направление. Напр, в абстрактную живопись :)
                Ответить
                • Полагаю, когда ты учил плюсы, ты сразу интуитивно додумался до всего лишь пролистав туториал ;-)
                  Ответить
                  • Вот к чему приводит листание туториалов по-диагонали...

                    Как можно прочитать о delete, но не прочитать о new и вообще о том, что такое куча?!

                    P.S. Сам я учил плюсы после паскаля, и уже имел представление о куче.
                    Ответить
                    • Спокойно можно! Туториал я официальный прочитал целиком, про delete знаю. Но не обратил внимания, наверное, на то, что он для ссылок. И я знаю про new и знаю, как и зачем им пользоваться.
                      Ответить
                      • >delete знаю. Но не обратил внимания, наверное, на то, что он для ссылок.

                        > он для ссылок
                        в тундру
                        Ответить
                      • > про delete знаю
                        Ну вот в том и прикол - про то, что delete есть прочитали, а про то, зачем он юзается, однозначно нет. Хотя есть возможность, что проблема не в вас, а в туториале.

                        P.S. Почитайте лучше вместо туториалов нормальную книжку. Шилдт вроде-бы неплохую написал. Ну и The C++ Programming Language от автора крестов.
                        Ответить
                      • > Спокойно можно!
                        Ничего личного. Просто заебала уже эта ситуация, когда новички начинают учить язык по туториалам. Вы не первый, и не единственный, кто попался на эту удочку ;(

                        По туториалу, имхо, можно изучать основы языка только тем, кто как минимум пару языков полноценно осилил, и для него динамическая память, GC, исключения, классы, указатели, основные структуры данных, приемы разработки и т.п. уже не являются чем-то новым.

                        И самое плохое в туториалах то, что зачастую их пишут нубы, не разобравшиеся в проблеме. В духе "Написал тут на днях связный список, пойду учебную статью на хабре запилю".

                        P.S. Подкиньте ссылочку на ваш туториал, плиз.
                        Ответить
                        • http://cplusplus.com/ там книга есть. А до этого я знал ПХП, конечно, не такой высокоуровневый язык, но тем не менее я в этом шарю
                          Ответить
                          • Ну собственно нормальное описание там про new/delete: http://www.cplusplus.com/doc/tutorial/dynamic/. Не знаю, что побудило удалять автоматические переменные. Случаем не знание javascript'а с его delete? :)

                            > ПХП, конечно, не такой высокоуровневый язык
                            Да PHP повыше уровнем будет, чем c++. Но не скажу, что проще.
                            Ответить
                            • По-моему, он значительно проще О_О
                              Ответить
                              • Ну да, проще, но тонкостей тоже хватает.
                                Ответить
                              • Как ты в PHP сравниваешь строчки? :)
                                Ответить
                                • str1 === str2
                                  Ответить
                                  • А в плюсах строк вообще нет, лол
                                    Ответить
                                    • > А в плюсах строк вообще нет, лол
                                      Это в си нет, там есть только строковые литералы, но не строки. А в крестах есть вполне полноценный класс.
                                      Ответить
                                      • Может путаю, но кажется я это в умной книжке по плюсам читал. Если найду пруф - поделюсь. Не найду - позор мне
                                        Ответить
                                        • > Может путаю
                                          А тут смотря с какой точки зрения смотреть.

                                          Встроенного типа "строка" там действительно нет. Но есть в стандартной библиотеке класс std::string, и есть строковый литерал, который на самом деле просто сахарок для массива из конст чаров.

                                          Поэтому строки в крестах и есть и нет ;)
                                          Ответить
                                          • >Встроенного типа "строка" там действительно нет. >Но есть в стандартной библиотеке класс std::string, и есть строковый литерал, который на самом деле просто сахарок для массива из конст чаров.

                                            Я об этом и говорил)
                                            Ответить
                                            • > А в плюсах строк вообще нет, лол
                                              > кажется я это в умной книжке по плюсам читал

                                              я тоже читал эту откровенно пессимистическую статью-перевод с хабра, но искать мне её лень.
                                              Ответить
                                          • Минуснувший, поясни пожалуйста, в чем я не прав.
                                            Ответить
                                            • ложная тревога - у меня рука дрожат, а исправить ничего нельзя....
                                              Ответить
                            • Так в жабоскрипте delete только свойства объектов удаляет. Локальные переменные удалить вовсе нельзя.
                              Ответить
                              • мол сами сдохнут когда scope схлопнется?)
                                Ответить
                                • Локальные переменные создаются на стеке* когда тело функции выполнено, указатель заведующий памятью стека возвращается туда, откуда началось выполнение функции. Т.е. ничего не убирается, просто все следующие переменные будут создаваться поверху. Но это не обязательно так, и не требуется стандартом. В некоторых реализациях есть регистры, и только дополнительные переменные создаются на стеке. В теории работа с регистрами должна быть быстрее. Но, опять же, специально значения из регистров не удаляются, а перезаписываются, когда следующая функция начинает выполняться. Кроме этого у каждой функции есть локальное хранилище, где находятся ссылки на захваченные переменные. Последние могут быт удалены гораздо позже того, как функция завершится, если вообще.
                                  Ответить
                                  • Ну это я и имел в виду. Только менее разжеванно)
                                    Ответить
                          • >А до этого я знал ПХП

                            А теперь забыл?)

                            >не такой высокоуровневый язык, но тем не менее я в этом шарю

                            Плюсы - они универсальные. На них все пишут - от дров до корпоративных приложений. И за универсальность приходиться платить порогом вхождения. Шарить в ПХП и шарить в плюсах - небо и земля.

                            Кстати пхп многие считают быдлоязыком. На самом деле репутацию языка составляют кодеры, так уж повелось, что на пхп кодят в основном не совсем адекватные личности. Многие считают, что плюсы таки излишни - достаточно знать си и Java. Я к тому, что, раз есть такие проблемы как use-after-free, то есть проблемы и с ООАиП и ООП. Может пока стоит теорию почитать да си подучить? Наскоком все и сразу вряд ли дастся.
                            Ответить
                            • > Плюсы - они универсальные. На них все пишут - от дров до корпоративных приложений.
                              Ну сейчас корпоративщики все-таки уходят в сторону жабы\шарпа. А дрова, емнип, они всегда на си без плюсов, ибо ядерный рантайм совсем не такой, как в юзерленде.

                              Вот и остаются для крестов игрушки да сервера, в которых требуется производительность, которую ява/шарпик/питон не вытянут, а на сишке пилить будет неудобно... Ну и legacy проекты, которые уже на с++ начаты.

                              > Многие считают, что плюсы таки излишни - достаточно знать си и Java.
                              И не без оснований ;)
                              Ответить
                              • > Ну сейчас корпоративщики все-таки уходят в сторону жабы\шарпа.

                                Что вполне логично - удобнее же.

                                >А дрова, емнип, они всегда на си без плюсов, ибо ядерный рантайм совсем не такой, как в юзерленде.

                                У меня знакомый работает в конторке по написанию софта usb устройств, микроэлектроники и всякого такого, и он говорил, что весь код на плюсах (ибо без ооп хреновенько)

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

                                > И не без оснований ;)

                                Тут еже можно вспомнить былинные холивары - плюсы али жаба. В итоге языки заняли свои ниши и мирно сосуществуют. И шарпик между ними.)
                                Ответить
                                • > софта usb устройств
                                  Не ну на самих контроллерах кресты юзают. И в софте для управления тоже. А вот именно в дровах для линуха или винды - чет очень сомнительно. Хотя могу ошибаться ;)
                                  Ответить
                                  • Да я тоже не претендую на истину в последней инстанции)
                                    Друг сказал что дрова тоже на плюсах, я сам удивился, ибо все-таки си достаточно
                                    Ответить
                                  • Нет проблемы писать на плюсах дрова. Рантайм стандартный, динамик касты и исключения можно поотключать. Получится эдакий Си с классами.
                                    Ответить
                                    • > динамик касты и исключения можно поотключать
                                      Нужно поотключать. Иначе придется писать несколько функций по их поддержке. new/delete тоже придется самому пильнуть.

                                      О стандартной крестолибе всяко придется забыть, ну разве что шаблонные классы будут работать.

                                      > Получится эдакий Си с классами.
                                      А так ли нужны там классы?

                                      Ну и пара вопросов:
                                      1) вы о винде или о линухе?
                                      2) писали ли вы дрова на плюсах сами, попадались ли вам дрова, написанные, на них (если да, то есть ли линк?), или же это просто рассуждения?
                                      Ответить
                                      • >А так ли нужны там классы?

                                        Классы - это удобно. А если есть возможность - почему бы и нет?
                                        Ответить
                                        • > Классы - это удобно
                                          Стильно, модно, молодежно!
                                          Ответить
                                          • А также наличиствуют квадратно-гнездовые паттерны. Все в лучших традициях лондОна и парижу
                                            Ответить
                                    • > Получится эдакий Си с классами
                                      Там что важно есть женешаблоны, коих в сишке нету.
                                      Ответить
                              • Насколько я знаю, дрова Darwin на плюсах пишутся (ну и Haiku почти полностью на плюсах написана). Линус же пустит плюсы в ядро только через свой труп.
                                ООП при работе с usb весьма полезно, даже в ядре линупса оно в стиле ООП сделано, хоть и на голой сишечке.

                                Плюсы сами по себе тоже интересны, в основном из-за шаблонов и широких возможностей дизайна. Ну и просто хорошая школа жизни...
                                Ответить
                            • > На самом деле репутацию языка составляют кодеры, так уж повелось, что на пхп кодят в основном не совсем адекватные личности.
                              Дай дураку register_globals, он себе голову отпилит.
                              Ответить
                              • Из премии Дарвина
                                "Два фермера напившись виски(ну или чего там бухают
                                ковбои) начали спорить,кто из них самый смелый.Началось с
                                банальностей,во время спора швырялись мороженной репой.Этого было мало и
                                один из них с криком "смотри какой я крутой",взял бензопилу и отпилил
                                себе ступню.Другой,не долго думаю,типа "ты лох,вот я круче тебя" отобрал
                                пилу и одних махом отпилил себе голову.В Америке настолько суровые
                                фермеры,что на спор отпиливают себе башку..."
                                Ответить
                                • избавился от ненужного... даже странно, что он таки умер.
                                  Ответить
                    • И покажите мне в официальном же туториале про "кучи"
                      Ответить
                      • Идешь в гугл и гуглишь
                        Двоичная куча, 2-3 куча, Биномиальная куча, Фибоначчиева куча.
                        Зазубриваешь и пытаешься понять что это такое, а затем реализовать.
                        Раньше чем изучишь - тебе в программировании делать будет нечего.
                        Потом гуглишь
                        Куча память.
                        Не сладкая жизнь у пограммистов
                        Ответить
                        • Правильно. Пусть хоть структуры данных изучит.
                          Ответить
                      • Что таки есть куча? Куча - это такая неведомая ебаная хуйня, которая жрет память. Бывают кучи добрые и нежные (управляемые), а бывают и сатанинские (неуправляемые). В плюсах, ясен пень, сатанинская. Каждый раз, когда ты юзаешь new ты отдаешь куче маленькую частицу своей души^W^W^W область памяти. А куча дает тебе няштяки в работе с ней. Но когда ты больше не нуждаешься в няштяках ты должен сказать
                        "Куча-куча ты могуча,
                        но ужастна и говнюча,
                        Отпусти через делЕт
                        то, что new отдал тебе"
                        И, если тебе повезет, куча отпустит. И тебя тоже отпустит. А вообще - луркани хотя бы вики. Это конечно не тот ресурс для нужно учиться прогать, но когда знаний нет совсем - тоже сгодится
                        Ответить
                        • Не, ну тогда я просто не знал, как это называется. Я ж это юзаю и удаляю после ненадобности
                          З.Ы.: пасяп за столь понятное объяснение :D
                          Ответить
                          • Ты это, у меня то кодить не учись, я так то на плюсах не одной проги не написал.

                            Читай умные книжки
                            Ответить
                            • Зато в преподы нормально пойти можешь ))
                              Ответить
                              • Я смотрю ты меня полюбил, но, извини, но я повенчен с шарпом)
                                Ответить
                      • > покажите мне в официальном же туториале про "кучи"
                        Сначала покажите мне официальный кресто-туториал ;) Интересно было бы полистать.
                        Ответить
                        • Я думаю, даже если он и существует, то он уныл до невозможности
                          Ответить
                    • так грустно звучит - уже имел представление о куче г...
                      Ответить
                      • > уже имел представление о куче г...
                        Ну как бы да ;) Вот эта куча г.. http://govnokod.ru/10011 была написана как раз в то время.
                        Ответить
                  • Да, потому что ни в одном курсе, ни в одной книге, ни в одном туториале нет такой ереси. Про простое объявление рассказывается в начале, и учащийся привыкает к тому, что их достаточно просто объявить. А про указатели, кучу, выделение и уничтожение рассказывается где-то в середине. И подчеркивают всегда, что все, что new нужно delete, а остальное delete не нужно.

                    Понимаешь, да, людям свойственно ошибаться, не понимать чего-то во время обучения. Но не в таких масштабах. Я представляю, если бы ты учился на медицинском и тебе на практике пришлось бы ставить капельницу, а ты бы руку пациенту отрезал. Потом бы оправдывался, что читал туториал, но не обратил внимания, что руку в других случаях отрезают?
                    Ответить
                    • > если бы ты учился на медицинском
                      Ага, представляю - студент медухи поучаствовал в своей первой операции (в лучшем случае ставя зажимы и убирая кровь, ничего более серьезного ему не доверили), и пошел писать на хабре статью о том, как делаются операции, а другие "хирурги", начитавшись этой статьи пошли пользоваться этой статьей как руководством. Нонсенс? Да. Но в IT, к сожалению, именно так и делают.
                      Ответить
                      • Тогда бы я сам себя оперировал, да ну их нахер)
                        Ответить
                        • > сам себя оперировал
                          http://www.mojbred.com/files/20060917/Kurjezy_Vojennoj_Mediciny.htm
                          Читаем второй рассказ "Автономный Аппендицит" :)

                          P.S. Сборник не рекомендуется читать за едой и перед сном.
                          Ответить
                          • У меня 80% знакомых хирурги да патологоанатомы - я уже ничего не боюсь
                            Ответить
                          • Отличная книжка :) Прочитал пара лет назад с удовольствием! :)
                            Ответить
                          • есть еще Покровский "Расстрелять", рекомендую
                            Ответить
                            • > рекомендую
                              Спасибо, закинул на читалку.
                              Ответить
                          • >Хирург Пахомов
                            http://www.youtube.com/watch?v=65meByViGZs
                            Ответить
                            • Там рядом еще ссылки на surgeon simulator. Вот там уж точно "я хирург".
                              Ответить
                          • Как раз позавчера прочитал половину, шикарная штука. Жаль, эта версия не совсем полная.
                            Ответить
                          • После задолбавших по самую душу книг про ассемблер, барьеры памяти и прочую компьютерную ересь - легло как бальзам на душу.
                            Огромное спасибо.
                            Ответить
              • - delete применяется только к указателям на единичный объект, запиленный при помощи new.
                - delete[] применяется только к указателям на массив, запиленный при помощи new[].
                - free применяется только к указателям на блок памяти, запиленный с помощью malloc/realloc.

                Автоматические переменные аля int h, w; удалять не нужно. Аргументы функций и глобальные переменные тоже.
                Ответить
          • >Инициализация простая: int h, w; удаляю их так
            unset($h, $w)
            Ответить
    • намудрено
      Ответить
    • Ух ты, делит через запятую! Вот это я понимаю - логичный и удобный синтаксис :)
      Ответить
      • Дети, как правильно?
        delete &h, &w;

        или
        delete &h, &w, 0;

        ?
        Ответить
        • Как-то так: http://ideone.com/O9vBhv
          Ответить
          • Хахах велик и могуч :)
            Ответить
            • С++ такой С++. Жаль, что у delete приоритет сильнее, чем у запятой, и приходится рисовать скобки.

              P.S. Главное чтобы по моим крестоблядским шедеврам никто не учился писать код ;)
              Ответить
              • По моим познаниям уже кучу учат, норм.

                Реально жалко этих людей)
                Ответить
        • Похер.
          Ответить
          • Если
            int h, w;

            то второе правильнее.
            Ответить
            • чем?
              Ответить
              • Тем, что ничего не удаляет.

                P.S. Стоп. Приоритет у delete сильнее, чем у запятой. Значит только так:
                delete (&h, &w, 0);
                Или так:
                delete 0, &h, &w;
                А в вариантах LispGovno действительно похер, "удалит" первую.
                Ответить
    • Какой багор )))
      Ответить

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