У меня течет память или нет? - PullRequest
0 голосов
/ 14 января 2020

Хорошо, вот основные факты: 1014 *, когда я запускаю свою программу, я смотрю на «Диспетчер задач», она всегда одинакова.

Memory(active private working set)  Memory(private working set)
           1,412K                            1,412k

Это неплохо для 1М при первом запуске, и это стабильные цифры. Теперь мне нужно проверить на утечки памяти, поэтому я выполняю следующее.

        _CrtMemState checkPt1, checkPt2, checkPt3;
        _CrtCheckMemory();
        _CrtMemCheckpoint(&checkPt1);
        ClientSocket = INVALID_SOCKET;
        ClientSocket =  CurrentClass->AcceptIPV4();
        if (ClientSocket != INVALID_SOCKET) {
            thread (SubThread, CurrentClass, ClientSocket).join();
        }
        _CrtCheckMemory();
        _CrtMemCheckpoint(&checkPt2);
        _CrtMemDifference(&checkPt3, &checkPt1, &checkPt2);
        _CrtMemDumpStatistics(&checkPt3);
        _CrtMemDumpAllObjectsSince(&checkPt1);

Теперь это работает ХОРОШО, это совсем не мешает моей теме. Поток выполняется и получает отчет следующим образом.

The thread 0x4470 has exited with code 0 (0x0).
8924 bytes in 22 Free Blocks.
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 8924 bytes.
Dumping objects ->
Object dump complete.

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

  Memory(active private working set) Memory(private working set)
            1,652K                          1,652k 

Это увеличило все 225k после запуска только этого одного потока. Факт каждый раз, когда этот поток выполняется «Диспетчер задач» показывают увеличение примерно на 225К. Так у меня течет память или нет. У меня есть все строки кода в этом потоке, везде, где я использую mallo c, у него есть бесплатный, и везде, где я использую новый, есть удаление, которое идет с ним. Кто-нибудь может направить меня в правильном направлении?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Ответ заключается в том, что вы должны вызвать EmptyWorkingSet (GetCurrentProcess ()); эта функция для "Диспетчера задач", чтобы дать правильные номера. В противном случае «Диспетчер задач» не перехватывает всю освобожденную память. В большинстве случаев это происходит, когда вы блокируете текущую кучу с помощью идентификатора потока.

Кстати у меня вообще нет потерь памяти ....

0 голосов
/ 15 января 2020

Я бы порекомендовал использовать Valgrind, если включен Linux, и Dr. Memory, если включен Windows. У VS есть какой-то монитор памяти, но я не слишком изучил его. Доктор Память сработал для меня довольно хорошо, как и Вальгринд.

...