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

    +61.8

    1. 1
    2. 2
    CStringA * str = new CStringA; - создает и пашет на ура
    CStringA * str = (CStringA *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CStringA)); часов 5 назад так же пахало на ура, помылся в душе и ... бля мистика возвращает неверный указатель

    был мне задан такой вопрос =)

    Запостил: tz-lom, 24 Января 2010

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

    • Чума =) И за первую и за вторую строчку стоит расстреливать =)
      Ответить
      • Я конечно на знаток MFC (CStringA это ведь из MFC, так?), но чем тебе не нравится первая строяка?
        Ответить
        • может тем, что заместо CStringA лучше просто юзать CString?
          Ответить
        • Ну какгбэ систринг он во многом для того и есть, чтобы избавиться от ручного управления памятью. ИМХО писать new std::string, new CString, new auto_ptr<> -- говнокод =)
          Ответить
        • CString это typedef в зависимости от испльзования Unicode (CStringW) или Ansi (CStringA) и как-то принято использовать именно CString.

          А за такой код руки бы оторвал, почему после new нет скобочек? Типа конструктор можно и не вызывать. Соответственно и во втором варианте конструктор не вызывается, а если хочется в создать не в куче, так можно написать new(указатель) CString();
          Ответить
          • >> почему после new нет скобочек? Типа конструктор можно и не вызывать.
            каких таких скобочек? мне кажется ты что-то путаешь =)
            Ответить
            • Ай и правда путаю, но во втором варианте то где конструктор? Да и что смыслу выделять так память для CString, если внутри он все равно выделит по другому память)
              Ответить
              • а зачем указателю конструктор ? По умолчанию конструктора ему вполне хватает.
                Ответить
                • дааа,а переменные в начальные значения выставлять кто будет?
                  память аллоцированная на куче содержит рандомные значения
                  Ответить
                  • Во-первых, не совсем рандомные.
                    Во-вторых, конструктор по умолчанию пишется обычно как раз для сброса значений.
                    Ответить
    • Что и говорить MFC само по себе говно, да еще и совершенно не дуракоустойчивое
      Ответить
    • ГДЕ ЗДЕСЬ СИ КРЕСТ КРЕСТ???
      Ответить
    • вторая строчка -- выделение памяти с указанным размером, всего-лишь. Должно выглядеть вот так примерно:
      LPVOID * chunk = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CStringA));
      CStringA * str = new( chunk ) CStringA;
      Ответить
      • Так тоже не должно выглядить, ибо тоже говнокод, хоть и меньший.
        Ответить
        • а как _должно_ выглядеть?
          Ответить
          • дада, вот допустим есть выделенная память а в ней нужно породить класс живой? А?
            Ответить
            • А чем статическая память не нравится? Там можно и живой класс разместить даже тем же размещающим new.
              Ответить
    • В С++ испльзовать HeapAlloc - идиотизм.
      Ответить
      • Кидать спорные фразы без объяснения - идиотизм.
        Ответить
        • Постить комменты к говнокоду - идиотизм.
          Ответить

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