Visual Studio 2017 обнаруживает утечку памяти при использовании документа Poco Xml - PullRequest
0 голосов
/ 28 августа 2018

Если я использую класс Poco::XML::Document, Visual Studio выдает утечку памяти после запуска приложения.

Я создал простой ConsoleApplication из шаблонов проектов Visual Studio 2017 и добавил следующий код в Main

#include "pch.h"
#define _CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
#include <iostream>
#include <Poco/DOM/Document.h>
#include <Poco/DOM/AutoPtr.h>
int main()
{
    Poco::AutoPtr<Poco::XML::Document> pDoc = new Poco::XML::Document;
    std::cout << "Hello World!\n";
    _CrtDumpMemoryLeaks();
    return 0;
}

Это дамп утечки в Visual Studio (я пропустил некоторые части, потому что он действительно большой):

{1976} normal block at 0x0130C048, 8 bytes long.
 Data: <, /     > 2C 18 2F 01 00 00 00 00 
{1975} normal block at 0x0130C0F0, 8 bytes long.
 Data: <  /     > 10 18 2F 01 00 00 00 00 
{1974} normal block at 0x0130BD70, 8 bytes long.
 Data: <  /     > F4 17 2F 01 00 00 00 00 
{1973} normal block at 0x0130BE88, 8 bytes long.
 Data: <  /     > D4 17 2F 01 00 00 00 00 

....

{174} normal block at 0x012D87E0, 8 bytes long.
 Data: <        > C4 0B 89 0F 00 00 00 00 
{173} normal block at 0x012DB928, 32 bytes long.
 Data: <%Y-%m-%dT%H:%M:%> 25 59 2D 25 6D 2D 25 64 54 25 48 3A 25 4D 3A 25 
{172} normal block at 0x012D87A8, 8 bytes long.
 Data: <d       > 64 0E 89 0F 00 00 00 00 
{171} normal block at 0x012D8AF0, 8 bytes long.
 Data: <L       > 4C 0B 89 0F 00 00 00 00 
Object dump complete.

Я использую Poco в качестве DLL. Версия Poco 1.9.0 Я также использовал Dr. Memory для обнаружения утечек памяти. Это краткое изложение утечки:

ERRORS FOUND:
              12 unique,    12 total unaddressable access(es)
               0 unique,     0 total uninitialized access(es)
             146 unique,   201 total invalid heap argument(s)
               0 unique,     0 total GDI usage error(s)
               0 unique,     0 total handle leak(s)
               0 unique,     0 total warning(s)
               0 unique,     0 total,      0 byte(s) of leak(s)
               0 unique,     0 total,      0 byte(s) of possible leak(s)

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

ответил здесь .

Вот правильный способ проверки на утечки:

int main()
{
    _CrtMemState _state[3] = {0};
    _CrtMemCheckpoint(&_state[0]);
    {
        Poco::AutoPtr<Poco::XML::Document> pDoc = new Poco::XML::Document;
    }
    _CrtMemCheckpoint(&_state[1]);
    if (_CrtMemDifference(&_state[2], &_state[0], &_state[1]))
        _CrtMemDumpStatistics(&_state[2]); // Dump Memory Leaks
    return 0;
}
0 голосов
/ 28 августа 2018

Первая заметная вещь заключается в том, что pDoc все еще жив, когда вы вызываете отчеты об утечках. Так что вам следует: 1) уменьшить область действия pDoc 2) прекратить использование iostream, чтобы избежать возможного создания охранников, и проверить еще раз.

#define _CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
#include <Poco/DOM/Document.h>
#include <Poco/DOM/AutoPtr.h>
int main()
{
    {
        Poco::AutoPtr<Poco::XML::Document> pDoc = new Poco::XML::Document;
    }
    _CrtDumpMemoryLeaks();
    return 0;
}

Также было бы лучше использовать профилировщик памяти VS, а не _CrtDumpMemoryLeaks

...