Утечки памяти - ужас каждого программиста? - PullRequest
21 голосов
/ 06 февраля 2011

Я программирую игровой движок на C ++, который также поддерживает Lua.

Мой самый большой ужас: утечки памяти.

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

Я их боюсь, потому что мне кажется, что их очень трудно заметить. Особенно в сложных системах. Если мой движок почти закончен, игра запускается и память уходит, что я буду делать? Где я начну искать?

  • Оправдан ли мой страх утечек памяти?
  • Как узнать, где находится утечка памяти?
  • Разве нет хороших инструментов, которые помогают найти источник утечек памяти сегодня?

Ответы [ 12 ]

1 голос
/ 05 марта 2011

Как узнать, где находится утечка памяти?

Visual Leak Detector для Visual C ++ 2008/2010

1 голос
/ 07 февраля 2011

Существуют различные методы для отслеживания утечек памяти.

Самое простое - это использовать макрос и специальный распределитель, который будет хранить функцию, которая выделяет это.Таким образом, вы можете отслеживать каждое распределение и видеть, какие не удаляются, когда они должны быть.Затем вы можете начать писать unittest и утверждать, что память была освобождена.

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

  • Использовать локальное значение потока, чтобы идентифицировать подсистему или идентификатор класса (в отладочных сборках), который работает, чтобы ваш распределитель мог определить, кто выделяет память.Вы даже можете использовать стек для иерархического отслеживания использования памяти в вашем движке.
  • На самом деле получить стек вызовов и сохранить его, если ваш компилятор имеет достаточную поддержку.
  • Использовать пулы памяти для подсистем,и измерить, увеличивается ли их размер непропорционально.(Это также (заведомо плохой) обходной путь для утечки памяти, поскольку вы можете освободить весь пул за один раз, таким образом освобождая утечку памяти, если сможете).
  • В Windows есть несколько макросовкоторые отслеживают распределение памяти по исходной строке автоматически при отладочных сборках.

Вероятно, есть больше параметров, чем это.Тестирование и использование пользовательского глобального переопределения нового / удаления (которое может быть запрошено) должно оказаться полезным, если ваш дизайн это позволяет.

Кроме того, см. Документ Electronic Arts STL C ++ длянекоторое обсуждение того, что нужно сделать в STL / C ++ для поддержки правильной разработки игр.(Возможно, он немного более хардкорный, чем ваш движок, но он, безусловно, содержит много самородков вдохновения и изобретательности.)

...