内存泄漏一直是个很头疼的问题。这类bug的root cause通常都很难找,特别是当代码行数达到数十万行以上的时候。最近帮同事解决了一个此类内存泄漏的问题,原因是使用Xerces XML库不当所引起的。
程序在长时间运行时内存不停的在涨。反复测试后,发现只有在调用add/remove操作时内存会增长。然后进一步定位。把除了add/remove函数之外的能删的都删掉。但内存还是在长。调试的具体过程就不细说了,最后还是靠一个小case和google解决了问题。
精简后的伪代码:
- 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);