Отладка обнаружения утечки памяти кучи - странные результаты? - PullRequest
1 голос
/ 08 июля 2010

Я думаю, что мое приложение на C ++ жесткое и не пропускает память. Длительные стресс-тесты и статические анализаторы кода, кажется, указывают на это. Однако при выполнении сценария очень сложного использования встроенная отладочная куча Visual Studio 2008 при выходе выдает несколько предупреждений, таких как:

Обнаружены утечки памяти!
Сброс объектов ->
{318231} нормальный блок в 0x03397FF8, длиной 0 байт.
Данные: <> üû

Что такое «утечка» памяти длиной 0 байт? Я как-то развращаю кучу? Что может привести к тому, что куча отладки выдаст подобное предупреждение?

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Вид этих символов "u" после пустого значения в скобках выглядит жутко. Но, глядя на исходный код CRT, который может быть объяснен ошибкой в ​​коде дампа, кажется, что строка не завершается нулем, когда блок памяти равен 0 байтов (переменная valbuff в dbgheap.c).

В противном случае выделение нулевых байтов является поддерживаемым сценарием. И ваш код, не выделяющий его из памяти, тоже не совсем загадочный. Если вы можете получить число до стабильного вывода «нормального блока», то вы можете назначить _crtBreakAlloc () в коде инициализации, чтобы принудительно установить точку останова. Или вы можете установить условную точку останова на распределителе отладки CRT. Отследите вызов malloc или новый вызов, чтобы найти его.

1 голос
/ 08 июля 2010

Argh. Неважно, я нашел это. Статически связанная библиотека распределяла массивы длины 0 с помощью new []. Это было бы хорошо, я думаю, если бы он также использовал delete [], чтобы убить его. Однако вызов удаления был условным и происходил только в том случае, если размер массива> 0.

...