Утечки памяти в режиме отладки - PullRequest
1 голос
/ 29 января 2010

Есть ли причина для утечки программы при компиляции в режиме отладки, а не в выпуске?

(«Отладка» означает отладочную информацию и оптимизация компилятора отключена, «Релиз» означает отсутствие отладочной информации / полная оптимизация)

Это похоже на то, что он делает, но я не могу понять, почему. Кстати, очистить здесь не помогает

Ответы [ 8 ]

4 голосов
/ 29 января 2010

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

  • Условный код, скомпилированный в одной или другой версии
  • Места памяти вещей движутся
  • Специальное форматирование неинициализированных данных в отладочной версии
3 голосов
/ 29 января 2010

Вот еще один вызов assert () с побочными эффектами, это может привести к большим проблемам

assert (new Object());

может вызвать такое поведение, если assert оптимизирован в режиме выпуска

3 голосов
/ 29 января 2010

Как вы обнаруживаете утечку? Если это через диспетчер задач, реализация отладки MSVC сохранит свободную память, когда установлен флаг _CRTDBG_DELAY_FREE_MEM_DF.

Также возможно, что у вас есть утечка памяти, которая не существует в версии.

РЕДАКТИРОВАТЬ: Вы также можете вручную позвонить HeapCompact(GetProcessHeap(), 0). Кажется, я вспоминаю, что куча отладки всегда растет (т.е. она не возвращает свободные блоки), но я нигде не могу найти эту документацию.

1 голос
/ 29 января 2010

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

Скомпилируйте релиз с помощью #define _DEBUG и посмотрите, все ли это произойдет.

1 голос
/ 29 января 2010

В режиме отладки и выпуска используется другая модель памяти.

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

Что-то, что может вызвать это, - повреждение памяти(особенно повреждение стека).Это может быть причиной, почему есть различия.Другой причиной может быть то, что отладчик не освобождает все, но я в этом сомневаюсь.

Кстати, вы используете бета-версию VS 2010?Это также может быть ошибкой в ​​бета-версии.

0 голосов
/ 29 января 2010

Это может быть много вещей, но имейте в виду, что это может быть ложным срабатыванием. В режиме отладки вы можете рассчитывать на использование как минимум вдвое больше памяти. Это может привести к увеличению размера вашей программы во много раз, и обычно, когда он увеличивается, он не уменьшается снова, даже если вся память освобождается изнутри. Если «утечка» не ухудшается с течением времени, но в конечном итоге прекращается, это не является настоящей утечкой.

0 голосов
/ 29 января 2010

Попробуйте Куча дампов пользовательского режима , которая поставляется с Средствами отладки для Windows , также посмотрите, что может сказать Application Verifier . Все эти инструменты чрезвычайно мощные, настоятельно рекомендуем.

В противном случае, если у вас нет утечек кода, который * #ifdef -ed, я не вижу причин для утечки сборки Debug, в то время как Release в порядке.

0 голосов
/ 29 января 2010

условные #ifdef _DEBUG строки могут быть одной из причин.

...