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: ксерсес тоже не знаю.