использование утечек памяти - PullRequest
0 голосов
/ 28 марта 2011

У меня есть утечка в моем приложении, и я пришел, чтобы сократить мой код до следующего, и он пропускает около 12 КБ за итерацию.Я не вижу, является ли это проблемой с моим кодом или самой библиотекой xerces.Но, глядя на «Частные байты» в 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 ]

2 голосов
/ 28 марта 2011

Откуда impl удаляется?

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

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

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

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

0 голосов
/ 28 марта 2011

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

PS: также не знаете xerces.

...