Xerces утечки памяти используют

У меня есть утечка в моем приложении, и я пришел, чтобы сократить мой код до следующего, и это утечка около 12 КБ за одну итерацию. Я не вижу, является ли это проблемой с моим кодом или самой библиотекой xerces. Но, глядя на Private Bytes в Perfmon, я вижу только рост и отсутствие усадки, так что он явно протекает.

Может кто-нибудь посоветовать, что может быть не так с приведенным ниже кодом, который вызывает его утечку с такой невероятной скоростью?:

(однопоточное тестовое приложение)

for (int x = 0; x < 1000000; x++){
        DataSerializer* ds = new DataSerializer();
        ds->test(request);
        ds->releasedocument();
        ds->destroy_xml_lib();
        delete ds;
    }

void DataSerializer::test(std::string& request)
{
    impl = initialize_impl();
}
DOMImplementation* DataSerializer::initialize_impl()
{
    try
    {
        boost::mutex::scoped_lock init_lock(impl_mtx);
        XMLPlatformUtils::Initialize();
        return DOMImplementationRegistry::getDOMImplementation(XConv("Core"));
    }
    catch(const XMLException& toCatch)
    {
        char *pMsg = XMLString::transcode(toCatch.getMessage());
        std::string msg(pMsg);
        XMLString::release(&pMsg);
    }

    return NULL;
}
void DataSerializer::destroy_xml_lib()
{
    boost::mutex::scoped_lock terminate_lock (impl_mtx); //is being used in MT app
    XMLPlatformUtils::Terminate(); 
}
void DataSerializer::releasedocument()
{
    if (document){
        document->release();
        document = NULL;
    }
}

Я не понимаю, как это может протечь? Что я пропустил?

2 ответа

Решение

Где же impl удалить?

Я ничего не знаю об API больше, чем поискать документы в Google, но они предлагают мне не звонить Terminate() - в реальной программе другой код в другом месте, возможно, в других потоках, все еще может использовать библиотеку xerces.

DOMImplementation возвращается как указатель и имеет деструктор - четкие признаки того, что вы должны управлять его временем жизни. Кажется, действительно правдоподобная история, что это утечка памяти.

Кроме того, что DOMImplementationRegistry::getDOMImplementation() может вернуться NULL так что вы должны остерегаться этого.

Если вы можете запустить это в Linux, используйте Valgrind (Purify - коммерческий эквивалент для Windows)

Не уверен, где вы размещаете document, В функции ReleaseDocument() вы не удаляете ее. Все, что вы делаете, это устанавливаете его на ноль после очистки его содержимого.

PS: ксерсес тоже не знаю.

Другие вопросы по тегам