我的应用程序出现泄漏,我将代码减少到以下内容,并且每次迭代泄漏大约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;
}
}
我不明白这怎么可能泄漏?我错过了什么?
答案 0 :(得分:2)
impl
在哪里被删除?
我对API的了解不多于谷歌搜索文档,但他们告诉我你不应该调用Terminate()
- 在一个真实的程序中,其他地方的其他代码,可能在其他线程中,可能仍在使用xerces库。
DOMImplementation
作为指针返回并有一个析构函数 - 清楚地表明你必须管理它的生命周期。这似乎是一个非常可能的故事,那就是你的内存泄漏。
此外,DOMImplementationRegistry::getDOMImplementation()
可以返回NULL
,因此您必须谨防。{/ p>
如果你可以在Linux上运行它,请使用Valgrind(Purify是Windows的商业等价物)
答案 1 :(得分:-1)
不确定您分配document
的位置。
在ReleaseDocument()函数中,您不会删除它。您只需在清除其内容后将其设置为零。
PS:也不知道xerces。