Почему TraceV в ATL / MF C вызовет утечку памяти? - PullRequest
1 голос
/ 17 января 2020

Я использую 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

Есть ли какие-либо намеки на это?

Спасибо.

...