Я использую VS2019, код C ++ скомпилирован в 32-битный исполняемый файл. Операционная система: Windows 10.
. TraceV находится в MSVC \ 14.24.283 \ atlmfc \ include \ atltrace.h.
. Внутри него используется следующий код для выделения символа или Массив wchar_t для хранения строки трассировки.
CHeapPtr<wchar_t> wszBuf;
if (!wszBuf.Allocate(chCount))
{
return;
}
wszBuf[0] = '\0';
if (swprintf_s(wszBuf, chCount, L"%ls%ls", wszCategory, pwszMessage) == -1)
{
return;
}
Если вы посмотрите на CHeapPtr, память будет освобождена в деструкторе. Кажется, здесь нет причин для утечки какой-либо памяти.
В режиме выпуска утечки памяти нет (я пытался отслеживать в диспетчере задач, и память очень долго не увеличивалась).
В режиме отладки используемая память вскоре достигает 2G, и это вызывает исключение выделения памяти.
Я попытался использовать _CrtDumpMemoryLeaks (), и, к моему удивлению, все утечки памяти - это небольшие объекты с 10 -50 байтов, и они должны быть созданы в функции TraceV. Однако, поскольку существует так много трассировок, из дампа утечки памяти я не могу определить, какой вызов Trace вызывает утечку памяти, и поэтому трудно отладить и шаг за шагом понять, почему он не освобожден.
Для тех, кто подозревает, что Утечка произошла не из-за выделения CHeapPtr от TraceV, ниже приведен снимок. Как вы можете видеть, я сделал снимок через 14 секунд после запуска приложения, и существует множество символов char [] и wchar_t [] с возрастом более 7 секунд, и эти char [] и wchar_t [] расположены в TraceV, что означает, что они не освобождаются в течение 7 секунд! И число 7 секунд будет расти с течением времени.
![Snapshot of memory](https://i.stack.imgur.com/nf54g.png)
Есть ли какие-либо намеки на это?
Спасибо.