You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by bu...@apache.org on 2001/12/07 11:27:49 UTC
DO NOT REPLY [Bug 5311] New: -
Memory leak parsing XML file
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=5311>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=5311
Memory leak parsing XML file
Summary: Memory leak parsing XML file
Product: Xerces-C++
Version: 1.5
Platform: PC
OS/Version: Other
Status: NEW
Severity: Critical
Priority: Other
Component: Validating Parser (DTD)
AssignedTo: xerces-c-dev@xml.apache.org
ReportedBy: alfred.wertner@joanneum.at
I got severe memory leaks when i parse XML Files with DOMParser class and using
DTD validation.
Here the simple main() routine of the test application:
void main()
{
try
{
// Initialize DCM Environment (includes
XMLPlatformUtils::Initialize())
cout << endl << "Initializing DCM environment..." << endl;
DCMEnvironment::InitEnv();
cout << "successful" << endl;
}
catch(MissingEnvVariableException& e)
{
cout << endl << "Failure during initializing DCM environment!"
<< endl;
cout << "Reason: " << e.getDescription() << endl;
return;
}
catch(ParserInitializationException& e)
{
cout << endl << "Failure during initializing DCM environment!"
<< endl;
cout << "Reason: " << e.getDescription() << endl;
return;
}
catch(ModulesInitializationException& e)
{
cout << endl << "Failure during initializing DCM environment!"
<< endl;
cout << "Reason: " << e.getDescription() << endl;
return;
}
catch(...)
{
cout << endl << "Failure during initializing DCM environment!"
<< endl;
cout << "Reason: unknown" << endl;
return;
}
// run the test
testLoad_ImgSequence();
// Clean up DCM Environment (includes XMLPlatformUtils::Terminate())
Diamant::DCM_L::DCMEnvironment::ExitEnv();
int result=0;
result = _CrtDumpMemoryLeaks();
}
Here the parsing method:
void testLoad_ImgSequence()
{
ImageSequence* imgSeq=NULL;
int count=0;
while(count<100)
{
try
{
imgSeq = new ImageSequence
("d:\\Repository\\Is\\", "flicker.xml");
}
catch (InvalidParameterException& e)
{
imgSeq=NULL;
}
catch (DatafilebaseNotUniqueException& e)
{
imgSeq=NULL;
}
catch (ParserErrorException& e)
{
imgSeq=NULL;
}
catch (XMLFileIOException& e)
{
imgSeq=NULL;
}
catch (...)
{
imgSeq=NULL;
}
// clean up
if (imgSeq!=NULL) delete imgSeq;
cout << "ImageSequence loaded." << endl;
count++;
}
}
With each creation of a ImageSequence instance the given XML file is parsed and
some attributes in DOM are read:
ImageSequence::ImageSequence(...)
{
//...
// now load the image sequence data from xml
DOM_Element imageSeq = _XmlDocument.getDocumentElement();
// did we have a image sequence?
if(imageSeq!=NULL)
{
DOM_NamedNodeMap ISAttributes = imageSeq.getAttributes();
DOM_Node attribute;
DOMString attrName;
DOMString attrValue;
char* attrNameVal;
char* attrValueVal;
for(int32_t count=0;count<ISAttributes.getLength();count++)
{
attribute = ISAttributes.item(count);
attrName = attribute.getNodeName();
attrValue = attribute.getNodeValue();
attrNameVal = attrName.transcode();
attrValueVal = attrValue.transcode();
// initialize the attributes of the image sequence
if (!strcmp(attrNameVal,"FPS"))
_Fps = atoi(attrValueVal);
//...
delete attrNameVal;
delete attrValueVal;
}
}
The instrumentalized the Xerces Debug Lib with the Boundschecker and got a lot
of memory leaks, e.g.:
QName::QName(QName* const qname) constructor:
line: fLocalPart = new XMLCh[fLocalPartBufSz + 1];
unsigned int ElemStack::addChild(QName* const child, const bool toParent)
method:
curRow->fChildren[curRow->fChildCount++] = new QName(child);
etc.
I hope you can give some comments immediately.
Thanks in advance.
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org