【发布时间】:2018-09-15 13:33:23
【问题描述】:
我无法理解 Xerces-C++ 内存管理。
如果我有这个(示例)XML 文件“config.xml”:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<port>
<reference>Ref1</reference>
<label>1PPS A</label>
<enabled>true</enabled>
</port>
</settings>
还有这段代码:
#include <xercesc/dom/DOM.hpp>
XERCES_CPP_NAMESPACE_USE
DOMElement *nextChildElement(const DOMElement *parent)
{
DOMNode *node = (DOMNode *)parent->getFirstChild();
while (node)
{
if (node->getNodeType() == DOMNode::ELEMENT_NODE)
return (DOMElement *)node;
node = node->getNextSibling();
}
return nullptr;
}
int main(int argc, char **argv)
{
XMLPlatformUtils::Initialize();
XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
DOMLSParser *parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
DOMDocument *doc = impl->createDocument(0, 0, 0);
doc = parser->parseURI("config.xml");
DOMElement *el = doc->getDocumentElement(); // <settings>
el = nextChildElement(el); // <port>
el = nextChildElement(el); // <reference>Ref1</reference>
// Heap blows up here
while (1) {
char *cstr = XMLString::transcode(el->getTextContent());
XMLString::release(&cstr); // cstr is "Ref1"
}
// and/or here
while (1) {
XMLCh *xstr = XMLString::replicate(el->getTextContent());
char *cstr = XMLString::transcode(xstr); // cstr is "Ref1"
XMLString::release(&cstr);
XMLString::release(&xstr);
}
}
为什么程序(堆)内存在while (1) 循环中爆炸。任一循环都会导致相同的内存问题:
注意:我使用的是 Visual Studio 2017,并且我已经在这些配置中进行了测试(所有结果都相同):
- xerces-c-3.2.1,静态库,x64
- xerces-c-3.2.1,动态 (dll),x64
- xerces-c-3.1.2,静态库,x64
【问题讨论】: