- Xerces-C++ version number: 2.8
- Platform: Windows 32Bit
- Operating system and version number: Windows Server 2003 SP 2
- Compiler and version number: MSVC 6 SP6
- Built Xerces by myself
I'm parsing a xml document. Therefore I have a XercesDOMParser instance. I
create this instance once and reuse it to scan one xml document cyclically. The
xml document is valid. I get some data from the document. With every parse
Purify reports a _potential_ memory leak of 1680 Bytes. But If I start the
program without purify the memory consumption increases all the time. So I
think it is a memory leak. Is this a memory leak or do I have to add some more
release or cleanup calls (if so where?)?
The following code extract eplains the code (error checking deleted for
simplicity). I changed my program to do only the parse function.
Creating the parser (only once):
=======================
DOMDocument* _xmlDoc = NULL;
DOMNode* _actualNode = NULL;
XercesDOMParser* _parser = NULL;
XMLPlatformUtils::Initialize();
_parser = new XercesDOMParser();
_parser->setValidationScheme(XercesDOMParser::Val_Auto);
_parser->setIncludeIgnorableWhitespace(false);
_parser->setDoNamespaces(true);
_parser->setDoSchema(false);
_parser->setErrorHandler(this);
Parsing the file (cyclically):
====================
do
{
if (_xmlDoc!=NULL)
{
_xmlDoc->release();
}
try
{
transcodexmlch = XMLString::transcode(filename);
_parser->parse(transcodexmlch);
XMLString::release(&transcodexmlch);
}
catch ()...
_xmlDoc = _parser->getDocument();
_actualNode = _xmlDoc->getDocumentElement();
} while ( true );
Purify shows a memory leak of total 2680 Bytes. The following trace gives the
biggest memory leak:
[I] MPK: Potential memory leak of 1288 bytes from 23 blocks allocated in
xercesc_2_8::MemoryManagerImpl::allocate(UINT) [XERCES-C_2_8D.DLL]
Offset 0x00000008 referenced by 0x024e9370, a location in a C++ new
block
Offset 0x00000008 referenced by 0x024ef170, a location in a C++ new
block
Distribution of potentially leaked blocks
Allocation location
new(UINT) [E:\DEVELOP\program\DEBUG\XERCES-C_2_8D.DLL]
xercesc_2_8::MemoryManagerImpl::allocate(UINT)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\internal\MemoryManagerImpl.cpp:35]
{
void* memptr;
try {
=> memptr = ::operator new(size);
}
catch(...) {
throw OutOfMemoryException();
xercesc_2_8::XMemory::new(UINT,MemoryManager::xercesc_2_8 *)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\util\XMemory.cpp:67]
size_t headerSize =
XMLPlatformUtils::alignPointerForNewBlockAllocation(
sizeof(MemoryManager*));
=> void* const block = manager->allocate(headerSize + size);
*(MemoryManager**)block = manager;
return (char*)block + headerSize;
xercesc_2_8::IGXMLScanner::scanStartTagNS(bool&)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\internal\IGXMLScanner.cpp:2393]
if (fGrammarType == Grammar::DTDGrammarType) {
elemDecl = new (fMemoryManager) DTDElementDecl(
qnameRawBuf, uriId, DTDElementDecl::Any,
fMemoryManager
=> );
elemDecl->setId(fDTDElemNonDeclPool->put((DTDElementDecl*)elemDecl));
}
else if (fGrammarType == Grammar::SchemaGrammarType) {
xercesc_2_8::IGXMLScanner::scanContent(void)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\internal\IGXMLScanner.cpp:896]
case Token_StartTag :
if (fDoNamespaces)
=> scanStartTagNS(gotData);
else
scanStartTag(gotData);
break;
xercesc_2_8::IGXMLScanner::scanDocument(InputSource::xercesc_2_8
const&)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\internal\IGXMLScanner.cpp:214]
else
{
// Scan content, and tell it its not an external
entity
=> if (scanContent())
{
// Do post-parse validation if required
if (fValidate)
xercesc_2_8::XMLScanner::scanDocument(WORD const* const)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\internal\XMLScanner.cpp:460]
}
Janitor<InputSource> janSrc(srcToUse);
=> scanDocument(*srcToUse);
}
void XMLScanner::scanDocument( const char* const systemId)
xercesc_2_8::AbstractDOMParser::parse(WORD const* const)
[E:\develop\xerces-c-src_2_8_0\src\xercesc\parsers\AbstractDOMParser.cpp:538]
try
{
fParseInProgress = true;
=> fScanner->scanDocument(systemId);
}
catch(const OutOfMemoryException&)
{
PAR_XMLDOMParser::parseFile(char *)
[E:\develop\program\source\xmlwrapper.cxx:378]
try
{
transcodexmlch = XMLString::transcode(filename);
=> _parser->parse(transcodexmlch);
XMLString::release(&transcodexmlch);
}
catch(const XMLException& toCatch)
Any help is appreciated.
With kind regards,
Mario Freimann