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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 SkaN, (Updated )

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

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

              Ты преувеличиваешь его вину. Он не удалял указатели на локальные переменные. И даже не удалял локальные переменные, размещенные по указателю. Он лишь удалил одну локальную переменную, размещеную по указателю.
              Ответить
        • >>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++. Но не скажу, что проще.
                          Ответить
                                  • > А в плюсах строк вообще нет, лол
                                    Это в си нет, там есть только строковые литералы, но не строки. А в крестах есть вполне полноценный класс.
                                    Ответить
                                    • Может путаю, но кажется я это в умной книжке по плюсам читал. Если найду пруф - поделюсь. Не найду - позор мне
                                      Ответить
                                      • > Может путаю
                                        А тут смотря с какой точки зрения смотреть.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  Понимаешь, да, людям свойственно ошибаться, не понимать чего-то во время обучения. Но не в таких масштабах. Я представляю, если бы ты учился на медицинском и тебе на практике пришлось бы ставить капельницу, а ты бы руку пациенту отрезал. Потом бы оправдывался, что читал туториал, но не обратил внимания, что руку в других случаях отрезают?
                  Ответить
                  • > если бы ты учился на медицинском
                    Ага, представляю - студент медухи поучаствовал в своей первой операции (в лучшем случае ставя зажимы и убирая кровь, ничего более серьезного ему не доверили), и пошел писать на хабре статью о том, как делаются операции, а другие "хирурги", начитавшись этой статьи пошли пользоваться этой статьей как руководством. Нонсенс? Да. Но в IT, к сожалению, именно так и делают.
                    Ответить
            • - delete применяется только к указателям на единичный объект, запиленный при помощи new.
              - delete[] применяется только к указателям на массив, запиленный при помощи new[].
              - free применяется только к указателям на блок памяти, запиленный с помощью malloc/realloc.

              Автоматические переменные аля int h, w; удалять не нужно. Аргументы функций и глобальные переменные тоже.
              Ответить
  • Ух ты, делит через запятую! Вот это я понимаю - логичный и удобный синтаксис 🙂
    Ответить

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

Из-за тебя ушел bormand, guest!

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


    8