内存泄漏xerces使用

时间:2011-03-28 10:03:02

标签: c++ memory-leaks

我的应用程序出现泄漏,我将代码减少到以下内容,并且每次迭代泄漏大约12kb。我无法看到这是我的代码的问题还是xerces库本身的问题。但是看看Perfmon中的Private Bytes,我只能看到增长而且没有收缩,所以它显然在泄漏。

有人可以建议以下代码可能出错,导致它以如此令人难以置信的速度泄漏吗?:

(单线程测试应用程序)

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 个答案:

答案 0 :(得分:2)

impl在哪里被删除?

我对API的了解不多于谷歌搜索文档,但他们告诉我你不应该调用Terminate() - 在一个真实的程序中,其他地方的其他代码,可能在其他线程中,可能仍在使用xerces库。

DOMImplementation作为指针返回并有一个析构函数 - 清楚地表明你必须管理它的生命周期。这似乎是一个非常可能的故事,那就是你的内存泄漏。

此外,DOMImplementationRegistry::getDOMImplementation()可以返回NULL,因此您必须谨防。{/ p>

如果你可以在Linux上运行它,请使用Valgrind(Purify是Windows的商业等价物)

答案 1 :(得分:-1)

不确定您分配document的位置。 在ReleaseDocument()函数中,您不会删除它。您只需在清除其内容后将其设置为零。

PS:也不知道xerces。