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

    +68

    1. 1
    2. 2
    char *GetNumRenderedObjectsString() { char *mString = new char [128]; itoa (mNumRenderedObjects, mString, 10); return mString; };
    char *GetNumDiscardedObjectsString() { char *mString = new char [128]; itoa (mNumDiscardedObjects, mString, 10); return mString; };

    Отличная работа с памятью.

    Запостил: benin, 25 Октября 2009

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

    • Да, забыл сказать - дело происходит в dll
      Ответить
    • И что? Решение конечно не лучшее, но не настолько плохое, чтобы считаться говнокодом.
      getline так работает и ничего.
      Ответить
      • Имя метода никак не говорит, что внутри память должна выделяться. А вызывающая сторона должна об этом знать, иначе утечёт память. 128 - магическая захардкоденная константа. И если код в главном цикле игры, то это не круто.
        Ответить
        • О том, что память выделяется можно написать в документации. Магическая константа здесь не так уж и страшна (хотя и великовата). И в главном цикле игры такие функции точно не нужны, это явно отладочная вещь.
          Ответить
          • Поддержание АКТУАЛЬНОЙ документации в продуктовом проекте не всегда оправдано и возможно. Слишком много сил разработчиков на это уходит и мало приемуществ. И зачастую она не нужна, если сигнатуры функций/методов вменяемые. Но это момент спорный. А вот зачем лишний напряг - лазить в документацию, когда пожно всё по сигнатуре прочесть, это непонятно.
            Ответить
          • Кстати, раз дело происходит в dll, то удалить память, выделенную в ней, приложению может быть проблематично :)
            Ответить
    • А если вызов будет происходить каждый кадр. Работая на 60 кадров в секунду, будем выделять по 128байт * 60 = 7.5Кб в секунду... а пару тысяч FPS будут жрать по четверть мегабайта в секунду...
      О какой реализации getline вы говорите ? Если о потоковой, то в неё ж параметром передается указатель на буфер (уже выделенной памяти)...
      Ответить

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