Я пишу собственный анализатор текстовых файлов (подобный JSON), и я потерял много часов, пытаясь найти в нем крошечную утечку памяти.
Я использую VC++2008 и команды _CrtMemCheckpoint и _CrtDumpMemoryLeaks для проверки утечек памяти.
Когда я анализирую любой файл, а затем удаляю его из памяти (наряду с любой другой заявленной памятью), я получаю 16-байтовую утечку памяти, которая выглядит следующим образом:
{290} normal block at 0x00486AF0, 16 bytes long.
Data: < H `aH hH eH > C0 9A 48 00 60 61 48 00 18 68 48 00 D8 65 48 00
Мне удалось сузить «оскорбительную» строку кода до этого:
classDefinitions[FastStr(cString)] = classDef;
classDefinitions — это std::map<FastStr, FSLClassDefinition*>
и частный член моего класса синтаксического анализатора.
FastStr — это простая «обертка» char*, позволяющая использовать простые c-строки в качестве значений ключа; у него нет утечек памяти (нет «новых» команд). 'FSLClassDefinition*', очевидно, является простым указателем на класс, так что здесь тоже нет ничего странного.
Теперь вот улов:
- эта строка выполняется много раз во время процесса синтаксического анализа, но я получаю утечку только одного 16-байтового блока.
- если я разбираю другой файл, нет еще одной 16-байтовой утечки памяти
- Если я удалю синтаксический анализатор из памяти (разместив его в блоке кода {}), затем воссоздам его в другом блоке кода и заставлю его проанализировать другой файл, то я получу второй 16-байтовый файл. утечка памяти.
Это заставляет меня подозревать утечку памяти в std::map; но это также может быть и моя ошибка... Я почти уверен, что это оскорбительная строка, потому что, если я остановлю синтаксический анализ перед, утечки памяти не будет; возможна утечка памяти, если я остановлю синтаксический анализ сразу после этой строки.
Кто-нибудь может это прокомментировать?