2011-03-28 158 views
0

我在應用程序中有泄漏,我已經將我的代碼減少到下面,並且每次迭代泄漏大約12kb。我看不到這是否是我的代碼問題或者xerces庫自身的問題。但看看Perfmon中的私人字節,我只能看到增長和收縮,所以顯然是漏了。內存泄漏xerces使用

有人可以請指教什麼可能是錯用下面的代碼,導致它在這樣一個令人難以置信的速度?:

(單線程測試程序)

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

也許你可以展示更多的源代碼?例如,DataSerializer構造函數是怎樣的? – 2013-03-20 17:29:06

回答

2

impl在哪裏得到刪除?

我對API沒有什麼比谷歌搜索文檔更多,但他們暗示我不應該調用Terminate() - 在一個真正的程序中,別處的其他代碼,可能在其他線程中,可能仍然使用xerces庫。

DOMImplementation作爲指針返回並具有析構函數 - 清除指示必須管理其生存期。這似乎是真的可能的故事,那是你的內存泄漏。

此外,DOMImplementationRegistry::getDOMImplementation()可以返回NULL所以你必須防範。

如果你能在Linux上運行它,使用Valgrind(淨化是一個用於Windows的商用當量)

+0

將:afaik這應該刪除impl:XMLPlatformUtils :: Terminate(); – 2011-03-28 10:10:52

0

不知道你在哪裏分配document。 在ReleaseDocument()函數中,您不會將其刪除。清除內容後,您只需將其設置爲零即可。 PS:不知道xerces也不知道。

+0

document-> release();刪除... – 2011-03-28 11:44:00