內存泄漏一直是個很頭疼的問題。這類bug的root cause一般都很難找,特別是當代碼行數達到數十萬行以上的時候。最近幫同事解決了一個此類內存泄漏的問題,緣由是使用Xerces XML庫不當所引發的。node
程序在長時間運行時內存不停的在漲。反覆測試後,發現只有在調用add/remove操做時內存會增加。而後進一步定位。把除了add/remove函數以外的能刪的都刪掉。但內存仍是在長。調試的具體過程就不細說了,最後仍是靠一個小case和google解決了問題。app
精簡後的僞代碼:ide
- xercesc::DOMElement* createDOM(MemBufInputSource source)
- {
- XercesDOMParser parser;
- xercesc::DOMElement* doc ;
- …
- parser.parse(source);
- doc = parser.adoptDocument();
- …
- return doc;
- }
- void init()
- {
- DOMElement* _workingXercesConfig = createDOM(src1);
- }
- void add()
- {
- DOMElement* xercesConfig = createDOM(src2);
- DOMElement* xercesDuplicate = dynamic_cast<DOMElement*>(_workingXercesConfig->cloneNode(true));
- DOMNode *node = xercesDuplicate->getOwnerDocument()->importNode(xercesConfig, true);
- xercesConfig->getOwnerDocument()->release();
- _workingXercesConfig->release();
- _workingXercesConfig = xercesDuplicate;
- …
- }
- _workingXercesConfig->getOwnerDocument()->release();
- …
- DOMElement* _configXerces = createDOM(src1);